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.
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 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
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".
Geben Sie in der Vorlage die URL wie folgt an.
<a href="{% url 'account:password:change'%}">Link zur Startseite</a>
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
-> ×
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