Django 模板文件的放置路径

5/9/2024 pythondjango

模板文件有两种, 一种是属于整个项目(project)的模板,一种是属于某个应用(app)的模板。模板文件的放置路径必需正确,否则Django找不到模板容易出现TemplateDoesNotExist的错误。

我们的目录结构如下:

./
├── README.md
├── docker-compose.yml
├── poetry.lock
├── pyproject.toml
├── requirements.txt
└── taskmanager
    ├── db.sqlite3
    ├── emoticons
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    ├── taskmanager
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── tasks
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── mixins.py
    │   ├── models.py
    │   ├── services.py
    │   ├── templates  # 应用模板文件
    │   │   └── tasks
    │   │       ├── base.html
    │   │       ├── help.html
    │   │       ├── home.html
    │   │       ├── task_confirm_delete.html
    │   │       ├── task_detail.html
    │   │       ├── task_form.html
    │   │       └── task_list.html
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    └── templates # 项目模板
        ├── _footer.html
        ├── _header.html
        └── index.html

# 项目模板

属于项目的模板文件路径一般是项目根目录下的templates文件夹。

需要在settings.py中将模板目录设置为BASE_DIR目录下的templates文件夹.

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
           BASE_DIR / 'templates', # 设置模板目录, 属于项目的模板文件路径一般是项目根目录下的templates文件夹
        ],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

那么 taskmanager/templates 就是项目模板目录。

# 应用模板

应用的模板文件路径一般是app目录下的app/templates/app文件夹(app 是应用名), 这样做的好处是可以避免模板命名冲突。

taskmanager/tasks/templates/tasks 是我们tasks应用的模板目录。

# 渲染模板

对于上面这个项目布局,在使用render方法指定渲染模板时,无需给出完整的路径,只给出相对于templates的路径即可,比如:

# 指定项目模板
return render(request, "index.html", { "msg": "hello world!",})

# 指定应用模板
return render(request, "tasks/home.html", { "tasks": tasks,})
上次更新: 5/9/2024, 9:43:59 AM