L'application Django crée un répertoire pour chaque application, donc
Si vous ajoutez des applications avec $ python manage.py startapp hoge
, les dossiers seront de plus en plus créés dans le répertoire racine.
C'est bien de pouvoir séparer les fonctionnalités pour chaque répertoire, mais toutes les fonctionnalités ne sont pas en parallèle, donc les perspectives s'aggravent à mesure que de nouvelles applications sont ajoutées.
Dans mon cas, j'emboîte souvent les répertoires comme . / App / sub_app /
... pour les rendre plus propres.
--Exemple de création d'applications en parallèle Bien que les fonctions puissent être séparées, cela ne correspond pas à l'url et les perspectives sont médiocres.
.
├── account/ (/account/login etc)
├── auth_api/ (/api/auth/...)
├── config
│ └── settings.py
├── email/ (/account/email/...)
├── manage.py
├── password/ (/account/password/...)
└── polls_api/ (/api/polls/...)
--Exemple d'applications d'imbrication L'url et le répertoire correspondent et sont faciles à comprendre.
.
├── account/ (/account/login etc)
│ ├── email/ (/account/email/...)
│ └── password/ (/account/password/...)
├── api/
│ ├── auth/ (/api/auth/...)
│ └── polls/ (/api/polls/...)
├── config
│ └── settings.py
└── manage.py
Cependant, il y a de nombreux points à trébucher, je vais donc résumer les points à noter.
Ce qui suit est la structure des dossiers lorsque $ django-admin startproject config .
puis 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
--Créer urls.py
Puisque ʻurls.py est souvent créé dans le répertoire de l'application, ajoutez ʻaccount / urls.py
.
Supposons que vous créez une vue appelée 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")
]
Incluez ʻaccount / urls.py dans
config / urls.py`.
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')), #ajouter à
]
dans
config / settings.py`.config/settings.py
INSTALLED_APPS = [
# defaults
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#ajouter à
'account'
]
Dans ce cas, l'url TopView est / account / top
.
Dans le modèle, spécifiez l'url comme suit.
<a href="{% url 'account:top'%}">Lien vers la page principale</a>
Lorsque le HTML est rendu, Django le développe comme ceci:
<a href="/account/top">Lien vers la page principale</a>
Dans le dossier «compte», créez une application «mot de passe» qui résume les fonctions liées aux mots de passe.
Il semble être créé par python manage.py startapp password account / password
,
Malheureusement, lorsque je spécifie l'emplacement avec startapp, cela ne crée pas de répertoire.
$ python manage.py startapp password account/password
CommandError: Destination directory '.../account/password' does not exist, please create it first.
Il vous sera demandé de créer d'abord un répertoire, alors créez-le. Ensuite, l'application sera créée dans «compte / mot de passe».
$ mkdir account/password
$ python manage.py startapp password account/password
Répertoire actuel.
.
├── account
│ ├── (Abréviation)
│ └── password
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── config
│ └── (Abréviation)
├── manage.py
├── poetry.lock
└── pyproject.toml
Créez «compte / mot de passe / urls.py» comme avant. J'ai créé une vue appelée «PassChangeView» dans View.
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'),
]
Incluez ʻurls.py dans ʻaccount / urls.py
.
Pour le moment, si vous incluez password.urls
, cela semble fonctionner, mais soyez prudent car cela ne fonctionnera que si vous définissez ʻaccount.password.urls`.
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") #ajouter à
]
À ce stade, l'url de PassChangeView est / account / password / change
.
Dans le modèle, spécifiez l'url comme suit.
<a href="{% url 'account:password:change'%}">Lien vers la page principale</a>
ʻUn mot de passe a été créé dans le compte / mot de passe, mais la migration ne peut pas être effectuée sans entrer l'application dans
config / settings.py. Lorsque vous remplissez ʻINSTALLED_APPS
, utilisez **. ** au lieu de **: **.
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' #ajouter à
]
migrate
Notez que le comportement est légèrement différent lors de la migration de l'application password
.
$ python manage.py makemigrations password
-> 〇
$ python manage.py makemigrations account.password
-> ×
$ python manage.py makemigrations account:password
-> ×
$ python manage.py makemigrations account/password
-> ×
Il est plus facile de comprendre la structure de répertoire qui correspond au chemin dans une certaine mesure, mais au début, je suis tombé par hasard à divers endroits, alors je l'ai résumé. Si vous faites jusqu'à 3 niveaux, ce sera assez compliqué, mais si vous faites 2 niveaux, ce sera rafraîchissant, c'est donc recommandé.
Recommended Posts