[PYTHON] Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln

Einführung

Was Sie tun sollten, wenn Sie mit Django entwickeln. Es wird schwierig sein, es später zu ändern, daher ist es möglicherweise besser, es in der Anfangsphase einzustellen, wenn auch nicht immer. ** "Einstellungen des Einstellungsverzeichnisnamens, der settings.py enthält" ** und ** "Erweitertes Benutzermodell" ** sollten erstellt werden.

Es mag viele andere Dinge geben, aber als Memorandum in dieser Phase.

Wer ist das Ziel dieses Artikels?

――Personen, die gerade die Tutorial-ähnlichen Unterrichtsmaterialien von Django fertiggestellt haben und im Begriff sind, Apps zu erstellen.

(1) Benennen Sie das Einstellungsverzeichnis beim Erstellen eines Projekts um

Dies ist eine Maßnahme, um die Verzeichnisstruktur des Projekts verständlicher zu machen. Wenn Sie normalerweise mit der Projekterstellung als "$ django-admin startproject myproject" beginnen, werden der Name des Basisverzeichnisses und der Name des Einstellungsverzeichnisses mit demselben Namen erstellt (in diesem Fall "myproject"), sodass es schwierig ist, zwischen ihnen zu unterscheiden. Ich werde.

Dies bedeutet, dass Sie beim Erstellen eines Projekts mit diesem Befehl eine solche Verzeichnisstruktur haben.

myproject   <-Basisverzeichnis
|-- manage.py
`-- myproject  <-Konfigurationsverzeichnis
    |-- __init__.py
    |-- settings.py
    |-- urls.py
    |-- manage.py
    `-- wsgi.py

Es gibt ein Basisverzeichnis mit demselben Namen wie der Projektname (in diesem Fall myproject) und ein Einstellungsverzeichnis mit demselben Namen wird darin erstellt. (Übrigens [Django-Lehrbuch << Grundlagen >>, das vor Ort verwendet werden kann], das zum Lernen verwendet wird [https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81] % A7% E4% BD% BF% E3% 81% 88% E3% 82% 8B-Django-% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6% 9B% B8% E3% 80% 8A% E5% 9F% BA% E7% A4% 8E% E7% B7% A8% E3% 80% 8B-% E6% A8% AA% E7% 80% AC-% E6% 98% 8E% E4% BB% 81 / dp / 4802094744) erleichtert die Unterscheidung

Da es heißt, werde ich diesem Namen folgen)


Es gibt also eine Möglichkeit, den Namen des Einstellungsverzeichnisses zu ändern, um das Verständnis der Struktur zu erleichtern.

Wenn Sie ein Projekt erstellen, verschieben Sie es nach dem Erstellen des Basisverzeichnisses mit einem beliebigen Namen (Projektname) unter das Basisverzeichnis, geben Sie im ersten Argument den Namen des Einstellungsverzeichnisses (hier config) und im zweiten Argument . an. Führen Sie dann "Projekt starten" aus.

$mkdir myproject (geben Sie hier den Projektnamen ein)
$ cd myproject/
$ django-admin startproject config .

Auf diese Weise wird die Verzeichnisstruktur

myproject   <-Basisverzeichnis
|-- manage.py
`-- config  <-Konfigurationsverzeichnis*Dieser Name ändert sich
    |-- __init__.py
    |-- settings.py
    |-- urls.py
    |-- manage.py
    `-- wsgi.py

So ist die Struktur leicht zu verstehen.

(2) Erweitern Sie das Benutzermodell

Django verfügt standardmäßig über ein Benutzermodell, mit dem Anmeldefunktionen usw. einfach implementiert werden können. Das allein ist sehr praktisch, aber um die Verwendung des Benutzermodells zu vereinfachen, wird [offiziell empfohlen], ein benutzerdefiniertes Benutzermodell zu erstellen [https://docs.djangoproject.com/ja/2.0/topics/ auth / customizing / # using-a-custom-user-model-beim-Starten-eines-Projekts).

Es gibt drei Möglichkeiten, das Benutzermodell zu erweitern.

  1. Erben Sie AbstractBaseUser
  2. Erben Sie "AbstractUser"
  3. Erstellen Sie ein anderes Modell und ordnen Sie es "OneToOneField" zu

Jede Methode hat ihre Vor- und Nachteile. Wenn die Entwicklung fortschreitet und bereits Daten in der Datenbank vorhanden sind, scheint Methode 3 gut zu sein. 1 oder 2 wird in der ersten Phase des Beginns der Anwendungsproduktion empfohlen, aber 1 scheint für Anfänger bis Anfänger schwierig zu sein, so dass es sicher ist, sich zunächst an Methode 2 zu gewöhnen.

Mit Methode 2 können Sie Ihrem Benutzermodell eigene Spalten hinzufügen.

Es ist einfach, ein benutzerdefiniertes Benutzermodell zu erstellen.

① Beschreiben Sie in app / models.py ( app ist der Name des Anwendungsverzeichnisses). ② Setzen Sie AUTH_USER_MODEL in config / settings.py ( config ist der Name des Einstellungsverzeichnisses, das beim Erstellen des Projekts erstellt wurde) ③ Migrieren

① Beschrieben in `models.py``

Definieren Sie hier ein benutzerdefiniertes Benutzermodell. (Da die Informationen, die dem Benutzermodell zugrunde liegen, im Modell "AbstractUser" definiert sind, werden sie vererbt und verwendet.)

Hier können Sie den Tabellennamen und die Spalten angeben, die Sie hinzufügen möchten. Sie können beispielsweise eine Tabelle mit dem Namen "custome_user" mit einer Spalte mit dem Namen "Calendar" mit einem externen Schlüssel festlegen.

app/models.py


from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    class Meta(AbstractUser.Meta):
        db_table = 'custom_user'
        swappable = 'AUTH_USER_MODEL'

    calendar = models.ForeignKey(Calendar, verbose_name='Aktiver Kalender', on_delete=models.PROTECT, blank=True, null=True)

Da dies ein Beispiel für meinen tatsächlichen Code ist, habe ich ein Modell namens "Kalender" mit dem Benutzermodell verknüpft. Wenn Sie jedoch möchten, dass das Benutzermodell Geschlecht, Alter, E-Mail-Adresse, Kennwort usw. enthält, geben Sie die Spalte hier an. Ich denke du solltest es mir geben. Da die Spalte zum Standardbenutzermodell hinzugefügt wird, bleibt die ursprüngliche Spalte erhalten (den Inhalt des Standardbenutzermodells finden Sie am Ende dieses Artikels in MEMO).

② Setze AUTH_USER_MODEL in settings.py

Definieren Sie das benutzerdefinierte Benutzermodell, das hier verwendet werden soll. Beschreiben Sie als "app name.model name"

config/settings.py


AUTH_USER_MODEL = app.CustomUser

③ Migrieren

Wenn Sie das Modell ändern, können Sie die Standarddatenbank migrieren.

$ Python manage.py makemigrations
$ Python manage.py migrate

Verschiedene für den Einstieg in Django

Über die Version

In Bezug auf die anzugebende Version scheint es keinen Fehler zu geben, wenn Sie die Version übernehmen, die ** LTS (Langzeitunterstützung) ** (= Version mit Langzeitsicherheitsunterstützung) entspricht.

--2.2 => Support bis April 2022 --1.11 => Unterstützung bis April 2020

Die Django 3-Serie wurde übrigens im Dezember 2019 veröffentlicht, aber 3.2, was LTS entspricht, soll im April 2021 erscheinen.

Wenn es keinen bestimmten Grund gibt, ist es richtig, im Moment mit dem neuesten LTS zu beginnen? Es ist ein Eindruck. (Wenn das Bereitstellungsziel festgelegt wurde, muss möglicherweise untersucht werden, ob der Server es unterstützt.)

Über Projekte und Anwendungen

Django hat das Konzept von "Projekt" und "Anwendung", also lasst es uns ein wenig organisieren.

Projekt Die gesamte zu erstellende WEB-Anwendung. $ django-admin startproject myproject Die mit dem Befehl erstellte (myproject ist der Projektname)     Anwendung Eine Gruppe kleiner Funktionen, die zu einem Projekt gehören python3 manage.py startapp myapp Die mit dem Befehl erstellte (myapp ist der Anwendungsname)


Das Projekt ist eine große Box, und die Anwendung ist ein Bild, das von jeder Funktion in der Box erstellt wird.

Wenn Sie einen WEB-Service erstellen, erstellen Sie ein Projekt. Wenn es sich um einen kleinen Service handelt, erstellen Sie eine Anwendung darin und implementieren Sie sie. Mit zunehmender Größe eines Projekts können mehrere Anwendungen in einem Projekt erstellt und betrieben werden.

Wenn Sie mehrere Anwendungen erstellen, scheint die Wartung einfacher zu sein, wenn Sie dies berücksichtigen.

abschließend

Nachdem ich die Tutorial-ähnlichen Unterrichtsmaterialien fertiggestellt hatte, stellte ich sie unterwegs vor.

[Django-Lehrbuch << Grundlagen >>, die vor Ort verwendet werden können](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF% E3% 81% 88% E3% 82% 8B-Django-% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6% 9B% B8% E3% 80% 8A% E5% 9F% BA % E7% A4% 8E% E7% B7% A8% E3% 80% 8B-% E6% A8% AA% E7% 80% AC-% E6% 98% 8E% E4% BB% 81 / dp / 4802094744)

Dieses Buch ist sehr leicht zu verstehen und bringt Ihr Studium voran!

Es deckt eine breite Palette von Grundlagen ab und ist gut zum Aufbau und Verstehen von Wissen. Sie können lesen, während Sie eine Prise essen. Viele der diesmal zusammengefassten Best-Practice-Methoden werden veröffentlicht und sind sehr nützlich.

MEMO: Über das Standardbenutzermodell

Als Referenz werden die in Django 2.1.7 bestätigten Felder des Benutzermodells aufgelistet. Das Standardbenutzermodell erbt vom AbstractUser-Modell, sodass die Spaltennamen im AbstractUser-Modell beim Erstellen eines benutzerdefinierten Benutzermodells übernommen werden.

lib/django/contrib/auth/models.py


class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)


class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username and password are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

Recommended Posts

Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Dinge, die Sie bei der Migration mit Django beachten sollten
[AWS] Was tun, wenn Sie mit Lambda pfeifen möchten?
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert
Django ab heute
Dinge, die Sie bei der Entwicklung von Crawlern in Python beachten sollten
Einstellungen, wenn Sie Python-Mecab mit Travis ausführen möchten
Links, um mit Sublime Text zu tun, was Sie wollen
Wenn Sie einen Test mit DB mit django schreiben, ist es möglicherweise schneller, `setUpTestData ()` zu verwenden
Eine Geschichte, die vorbereitet werden musste, wenn versucht wurde, ein Django-Tutorial mit einfachen Centos7 zu erstellen
Was tun, wenn bei der Installation von Python 2 mit pyenv ein OpenSSL-Fehler auftritt?
Was tun, wenn beim Importieren von matplotlib mit Jupyter ein Importfehler auftritt?
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Führen Sie eine AES-Verschlüsselung mit DJango durch
[Django] Memorandum, wenn Sie asynchron kommunizieren möchten [Python3]
Umgang mit statischen Dateien bei der Bereitstellung in der Produktion mit Django
Kenntnisse, die Sie beim Programmieren von Wettbewerben mit Python2 benötigen
Lösung, wenn Django Projekt starten ist unter Windows nicht möglich
Verwenden Sie aggdraw, wenn Sie mit Kissen schön zeichnen möchten
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
Was tun, wenn Sie keine Dateien mit Indizes sortieren können?
Was tun, wenn beim Importieren von _ssl ein Fehler auftritt?
Wenn Sie die Anfangsdaten von Django mit Relationen registrieren möchten
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
ImportError: Kein Modul Was tun, wenn Sie dazu aufgefordert werden?
[Memo muss hinzugefügt werden] Seite, die bei der Entwicklung mit GAE / P angezeigt wird
Ich kenne? Datenanalyse mit Python oder Dingen, die Sie mit numpy verwenden möchten, wenn Sie möchten
Was tun, wenn beim Versuch, pip mit pyenv zu verwenden, ein undefinierter Fehler angezeigt wird?
Was tun, wenn Ubuntu abstürzt?
Schritte zur Entwicklung von Django mit VSCode
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Umgang mit "Sie haben mehrere Authentifizierungs-Backends konfiguriert ..." (Django)
Bis Sie Jupyter in Docker starten
Was tun mit der Installation von Magics?
Was tun, wenn Sie pyaudio nicht mit pip #Python installieren können?
Schön dich mit Python zu treffen
Wenn es schwierig ist, das zu kopieren, was Sie mit vue erstellt haben
[Beanstalk] Was tun, wenn beim Importieren der UUID ein Fehler auftritt?
Standardisieren Sie HTML, um mit Django gemietet zu werden
Verhindert, dass beim Starten des Projekts mit Django unnötige Verzeichnisse unter dem aktuellen Verzeichnis erstellt werden
Schwanzrekursion mit Python2 durchführen
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Was tun mit PYTHON Release?
Wenn die WSL-Distribution nicht gestartet werden kann (Fehler: "WslRegisterDistribution fehlgeschlagen mit Fehler: 0x800706be.")
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten
Ich möchte ○○ mit Pandas machen
Was tun, wenn Sie mit Maven kein Projekt erstellen können?
Was tun, wenn "Ich kann die Site nicht sehen !!!!"
Python | Was Sie mit Python machen können
Wenn Sie das Intervall der Achsenskala mit APLpy anpassen möchten
Was tun, wenn bei Verwendung von Python mit der NetBeans-IDE die Warnung "Falsche Python-Plattform" angezeigt wird?
Was tun, wenn Sie wütend werden, wenn Sie nicht libxml / xmlversion.h haben, wenn Sie lxml in pip einfügen?
Was tun, wenn die Option -f von grep nicht funktioniert?
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören