【Django】目录结构的实践 + 注意事项

Django应用程序的目录

Django 应用程序每个应用都会生成一个目录,所以当使用 $ python manage.py startapp hoge 添加应用时,根目录会不断产生文件夹。

每个目录都可以分离功能是好的,但由于不是所有功能都是并行的,所以随着应用程序数量增加,视野会变得混乱不清。

对于我个人而言,在我的情况下,经常会将./app/sub_app/…和目录进行嵌套,以保持整洁。

    • 並列にアプリケーションを作っていく場合の例

 

    機能は分離できるものの、urlと対応しておらず見通しが悪い。
.
├── account/     (/account/login etc)
├── auth_api/    (/api/auth/...)
├── config
│   └── settings.py
├── email/       (/account/email/...)
├── manage.py
├── password/    (/account/password/...)
└── polls_api/   (/api/polls/...)

    • アプリケーションをネストして作っていく場合の例

 

    urlとディレクトリが対応し、わかりやすい。
.
├── account/      (/account/login etc)
│   ├── email/    (/account/email/...)
│   └── password/ (/account/password/...)
├── api/
│   ├── auth/     (/api/auth/...)
│   └── polls/    (/api/polls/...)
├── config
│   └── settings.py
└── manage.py

由于存在许多困难之处,因此需要总结注意事项。

环境

    • CentOS 7

 

    • Django 3.0.3

 

    Python 3.7.4

前提 tí)

假设执行了以下命令:“$ django-admin startproject config .” 和 “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
    urls.pyの作成

通常在应用程序目录下创建urls.py,因此添加一个 account/urls.py。
假设我们创建了一个名为 TopView 的视图。

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

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

在config/urls.py中包含account/urls.py。


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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('account/', include('account.urls')), # 追加
]
    • settings.pyに登録

 

    最後に、accountアプリケーションを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'
]
    urlの参照

在这种情况下, TopView的url是/account/top。
在模板中,指定url如下。

<a href="{% url 'account:top'%}">トップぺージへのリンク</a>

当HTML被渲染时,Django会以以下的方式展开。

<a href="/account/top">トップぺージへのリンク</a>

在account目录中创建应用程序。

创建一个应用程序

在account文件夹中创建一个整合了密码相关功能的密码应用程序。
如果使用python manage.py startapp password account/password进行创建,似乎会创建出这样的东西,但很遗憾,使用startapp指定位置时,它不会为我们创建目录。

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

因为被要求先创建一个目录,所以我创建了一个。
然后,应用程序被创建在帐户/密码内。

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

当前的目录。

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

将URL添加到收藏夹

按照以前的方式,创建账户/密码/urls.py。
在View中创建了一个名为PassChangeView的视图。

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

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

在account/urls.py中包含urls.py。

在这种情况下,如果包含password.urls,似乎可以工作,但要注意需要使用account.password.urls才能使其工作。

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") # 追加
]

在这种情况下,PassChangeView的URL将变为”/account/password/change”。

网址的引用 de

在模板中,可以如下指定URL。

<a href="{% url 'account:password:change'%}">トップぺージへのリンク</a>

在settings.py中注册应用程序

账户/密码已创建,但必须在config/settings.py中配置应用程序才能进行迁移。在填写INSTALLED_APPS时,请使用”.”而不是”:”。

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

    'account',
    'account.password' # 追加
]

迁徙 xǐ)

在进行密码应用的迁移时,需要注意一些略有不同的操作。

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

总结

将密码与目录结构相对应会更容易理解,但一开始我在各个地方遇到了困难,所以我总结了一下。
如果做到三层目录,就会变得非常凌乱,但如果只做到两层目录,会更清晰简洁,我推荐这样做。

广告
将在 10 秒后关闭
bannerAds