[PYTHON] [Django] Verzeichnisstrukturpraxis + Notizen

Django-Anwendungsverzeichnis

Die Django-Anwendung erstellt also für jede App ein Verzeichnis Wenn Sie Apps mit "$ python manage.py startapp hoge" hinzufügen, werden immer mehr Ordner im Stammverzeichnis erstellt.

Es ist schön, Funktionen für jedes Verzeichnis trennen zu können, aber nicht alle Funktionen sind parallel, sodass sich die Aussichten verschlechtern, wenn mehr Anwendungen hinzugefügt werden.

In meinem Fall verschachtele ich Verzeichnisse häufig als ". / App / sub_app /" ..., um sie sauberer zu machen.

.
├── account/     (/account/login etc)
├── auth_api/    (/api/auth/...)
├── config
│   └── settings.py
├── email/       (/account/email/...)
├── manage.py
├── password/    (/account/password/...)
└── polls_api/   (/api/polls/...)

--Beispiel für Verschachtelungsanwendungen Die URL und das Verzeichnis stimmen überein und sind leicht zu verstehen.

.
├── account/      (/account/login etc)
│   ├── email/    (/account/email/...)
│   └── password/ (/account/password/...)
├── api/
│   ├── auth/     (/api/auth/...)
│   └── polls/    (/api/polls/...)
├── config
│   └── settings.py
└── manage.py

Es gibt jedoch viele Punkte, über die man stolpern muss, daher werde ich die zu beachtenden Punkte zusammenfassen.

Umgebung

Annahme

Das Folgende ist die Ordnerstruktur, wenn "$ django-admin startproject config." Und dann "python manage.py startapp account".

.
├── account
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── poetry.lock
└── pyproject.toml

--Erstelle urls.py

urls.py wird häufig im Anwendungsverzeichnis erstellt, fügen Sie also account / urls.py hinzu. Angenommen, Sie erstellen eine Ansicht mit dem Namen TopView.

account/urls.py


from django.urls import path, include
from . import views

app_name = 'account'
urlpatterns = [
    path("top/", views.TopView.as_view(), name="top")
]

Fügen Sie account / urls.py in config / urls.py ein.

config/urls.py



from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('account/', include('account.urls')), #hinzufügen
]

config/settings.py


INSTALLED_APPS = [
    # defaults
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    #hinzufügen
    'account'
]

In diesem Fall lautet die TopView-URL "/ account / top". Geben Sie in der Vorlage die URL wie folgt an.

<a href="{% url 'account:top'%}">Link zur Startseite</a>

Wenn der HTML-Code gerendert wird, erweitert Django ihn folgendermaßen:

<a href="/account/top">Link zur Startseite</a>

Erstellen Sie eine Anwendung im Kontoverzeichnis

Erstellen Sie eine App

Erstellen Sie im Ordner "Konto" eine "Passwort" -App, in der die kennwortbezogenen Funktionen zusammengefasst sind. Es scheint von python manage.py startapp password account / password erstellt worden zu sein. Wenn ich den Speicherort mit startapp spezifiziere, wird leider kein Verzeichnis erstellt.

$ python manage.py startapp password account/password
CommandError: Destination directory '.../account/password' does not exist, please create it first.

Sie werden aufgefordert, zuerst ein Verzeichnis zu erstellen. Erstellen Sie es also. Dann wird die App in "Konto / Passwort" erstellt.

$ mkdir account/password
$ python manage.py startapp password account/password

Aktuelles Verzeichnis.

.
├── account
│   ├── (Abkürzung)
│   └── password
│        ├── __init__.py
│        ├── admin.py
│        ├── apps.py
│        ├── migrations
│        │   └── __init__.py
│        ├── models.py
│        ├── tests.py
│        └── views.py
├── config
│   └── (Abkürzung)
├── manage.py
├── poetry.lock
└── pyproject.toml

URL registrieren

Erstellen Sie wie zuvor account / password / urls.py. Ich habe in View eine Ansicht namens "PassChangeView" erstellt.

account/password/urls.py


from django.urls import path, include
from . import views

app_name = 'password'
urlpatterns = [
    path('change/', views.PassChangeView.as_view(), name='change'),
]

Fügen Sie urls.py in account / urls.py ein.

Wenn Sie zu diesem Zeitpunkt "password.urls" einfügen, scheint dies zu funktionieren. Seien Sie jedoch vorsichtig, da dies nur funktioniert, wenn Sie "account.password.urls" verwenden.

account/urls.py


from django.urls import path, include
from . import views

app_name = 'account'
urlpatterns = [
    path("top/", views.TopView.as_view(), name="top"),
    path("password/", include('account.password.urls'), name="password") #hinzufügen
]

Zu diesem Zeitpunkt lautet die URL von PassChangeView "/ account / password / change".

Verweis auf URL

Geben Sie in der Vorlage die URL wie folgt an.

<a href="{% url 'account:password:change'%}">Link zur Startseite</a>

Registrieren Sie die Anwendung in settings.py

Ein Passwort wurde in account / password erstellt, aber eine Migration ist nur möglich, wenn die Anwendung in config / settings.py eingegeben wurde. Verwenden Sie **. ** anstelle von **: **, wenn Sie INSTALLED_APPS ausfüllen.

config/settings.py


INSTALLED_APPS = [
    # defaults
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'account',
    'account.password' #hinzufügen
]

migrate

Beachten Sie, dass sich das Verhalten bei der Migration der Kennwortanwendung geringfügig unterscheidet.

$ python manage.py makemigrations password
    -> 〇
$ python manage.py makemigrations account.password
    -> ×
$ python manage.py makemigrations account:password
    -> ×
$ python manage.py makemigrations account/password
    -> ×

Zusammenfassung

Es ist einfacher, die Verzeichnisstruktur zu verstehen, die in gewissem Maße dem Pfad entspricht, aber zuerst bin ich an verschiedenen Stellen gestolpert und habe sie zusammengefasst. Wenn Sie bis zu 3 Levels machen, wird es ziemlich chaotisch sein, aber wenn Sie 2 Levels machen, wird es erfrischend sein, daher wird es empfohlen.

Recommended Posts

[Django] Verzeichnisstrukturpraxis + Notizen
Django Memo
Django Memo
Aktuelle Verzeichnisstruktur
[Django] as_view () Notizen
Linux-Verzeichnisstruktur
Linux-Verzeichnisstruktur
Sellerie-Notizen zu Django
[Django] Hinweise zur Verwendung der Django-Debug-Symbolleiste
Ausgabe der Tabellenstruktur in Django