[PYTHON] [Django] Pratique de la structure des répertoires + notes

Répertoire des applications Django

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.

environnement

supposition

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 à
]

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>

Créer une application dans le répertoire du compte

Créer une application

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

Enregistrer l'URL

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.

Référence à l'URL

Dans le modèle, spécifiez l'url comme suit.

<a href="{% url 'account:password:change'%}">Lien vers la page principale</a>

Enregistrez l'application dans settings.py

ʻ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
    -> ×

Résumé

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

[Django] Pratique de la structure des répertoires + notes
Mémo Django
Mémo Django
Structure de répertoire actuelle
Notes de [Django] as_view ()
Structure de répertoires Linux
Structure de répertoires Linux
Notes de céleri sur Django
[Django] Remarques sur l'utilisation de django-debug-toolbar
Sortie de la structure de table dans Django