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