Django 模板的正确结构是什么?
Whats the correct structure for Django templates?
我在 Django 中有一个名为“my_site”的项目,还有一个名为“blog”的应用程序,我正在尝试在路径中呈现“index.html”:my_site/blog/templates/blog/index.html.但不断收到此错误:
Template-loader postmortem
Django tried loadi
ng these templates, in this order:
Using engine django:
django.template.loaders.filesystem.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\admin\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\auth\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\blog\templates\index.html (Source does not exist)
观点:
def index(request):
return render(request, 'index.html')
urls.py:
urlpatterns = [
path('', views.index),
path('posts', views.show_all_posts),
path('posts/<slug:slug>', views.show_post)
]
如果我将 index.html 移出博客文件夹,如本例所示:my_site/blog/templates/index.html
代码运行并且 index.html 呈现没有问题,但我被告知正确的结构是在模板内创建一个与应用程序同名的文件夹。
那么谁能解释一下我应该如何构建我的文件?
Django 解析相对于位于应用程序目录内的“模板”目录的模板,并在名称匹配的所有应用程序中选择第一个模板。例如,如果您有两个应用程序:blog 和 news 都在“templates”目录中使用名为“index.html”的模板, Django 将无法正确选择其中之一。为了区分,您可以在“模板”目录中创建一个以相应应用程序命名的子文件夹:“blog/templates/blog/index.html”和“news/templates/news/index.html”。之后,您可以在视图函数中使用这些模板,如下所示:render(request, 'news/index.html') 和 render(request, 'blog/index.html' ).
您可以在此处阅读有关此主题的信息,查看备注“模板命名空间”:https://docs.djangoproject.com/en/4.0/intro/tutorial03/
而不是将其保留在应用程序中。我更喜欢将它保存在项目文件下。 my_site/templates/app_x/index.html
├───accounts
│
├───django_project
│
└───templates
├───accounts
└───registration
在 settings.py
文件中将 DIRS
更新为模板文件夹的路径。通常,templates 文件夹会创建并保存在 manage.py
.
的 sample 目录中
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'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',
],
},
},
]
如果我打开 templates
下的单独文件,我将它们呈现为 folder_name/index.html
,否则直接呈现为 index.html
。
我在 Django 中有一个名为“my_site”的项目,还有一个名为“blog”的应用程序,我正在尝试在路径中呈现“index.html”:my_site/blog/templates/blog/index.html.但不断收到此错误:
Template-loader postmortem
Django tried loadi
ng these templates, in this order:
Using engine django:
django.template.loaders.filesystem.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\admin\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\auth\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\blog\templates\index.html (Source does not exist)
观点:
def index(request):
return render(request, 'index.html')
urls.py:
urlpatterns = [
path('', views.index),
path('posts', views.show_all_posts),
path('posts/<slug:slug>', views.show_post)
]
如果我将 index.html 移出博客文件夹,如本例所示:my_site/blog/templates/index.html 代码运行并且 index.html 呈现没有问题,但我被告知正确的结构是在模板内创建一个与应用程序同名的文件夹。 那么谁能解释一下我应该如何构建我的文件?
Django 解析相对于位于应用程序目录内的“模板”目录的模板,并在名称匹配的所有应用程序中选择第一个模板。例如,如果您有两个应用程序:blog 和 news 都在“templates”目录中使用名为“index.html”的模板, Django 将无法正确选择其中之一。为了区分,您可以在“模板”目录中创建一个以相应应用程序命名的子文件夹:“blog/templates/blog/index.html”和“news/templates/news/index.html”。之后,您可以在视图函数中使用这些模板,如下所示:render(request, 'news/index.html') 和 render(request, 'blog/index.html' ).
您可以在此处阅读有关此主题的信息,查看备注“模板命名空间”:https://docs.djangoproject.com/en/4.0/intro/tutorial03/
而不是将其保留在应用程序中。我更喜欢将它保存在项目文件下。 my_site/templates/app_x/index.html
├───accounts
│
├───django_project
│
└───templates
├───accounts
└───registration
在 settings.py
文件中将 DIRS
更新为模板文件夹的路径。通常,templates 文件夹会创建并保存在 manage.py
.
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'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',
],
},
},
]
如果我打开 templates
下的单独文件,我将它们呈现为 folder_name/index.html
,否则直接呈现为 index.html
。