Python Django base.html扩展约定

Python Django base.html扩展约定,python,django,django-templates,django-views,Python,Django,Django Templates,Django Views,对于较新版本的Django,建议将静态文件和模板保存在以应用程序名称命名的目录中。例如,对于较旧版本的Django,应用程序的结构如下所示: app ├── admin.py ├── __init__.py ├── models.py ├── static │   └── design.css ├── templates │   ├── base.html │   └── index.html ├── tests.py └── views.py 而对于较新版本,建议的结构如下: app ├──

对于较新版本的
Django
,建议将静态文件和模板保存在以应用程序名称命名的目录中。例如,对于较旧版本的
Django
,应用程序的结构如下所示:

app
├── admin.py
├── __init__.py
├── models.py
├── static
│   └── design.css
├── templates
│   ├── base.html
│   └── index.html
├── tests.py
└── views.py
而对于较新版本,建议的结构如下:

app
├── admin.py
├── __init__.py
├── models.py
├── static
│   └── app
│       └── design.css
├── templates
│   └── app
│       ├── base.html
│       └── index.html
├── tests.py
└── views.py
现在,我应该如何根据较新的应用程序布局访问应用程序视图中的静态文件和模板?也就是说,在访问视图中的模板名称时,硬编码应用程序名称是一个好主意吗

def index(request):
    return render(request, 'blog/index.html', {})
类似地,在扩展了
base.html
的模板
index.html
中,需要如下引用它:

{% extends "blog/base.html" %}
同样,这涉及到在模板中硬编码应用程序的名称。这是个好主意吗?如果我决定重命名该应用程序,我将需要在这么多文件中进行更改

或者,我是否缺少任何允许我将
base.html
引用为

{% extends "base.html" %}

在我的模板中,避免提及应用程序名称?

我认为在模板中硬编码应用程序名称是一个好主意,因为您可能有多个应用程序具有相同名称的模板。如果您只输入模板的名称,Django将使用该名称的第一个模板(如果您有多个同名模板,这可能是错误的)。

这与Django的较新或较旧版本无关,这与以下事实有关:
collectstatic
命令将覆盖类似名称的文件;添加应用程序名称会为静态文件创建一个“名称空间”

您应该只对静态文件执行此操作,模板应该放在应用程序的主“模板”目录中;当然,如果您有不属于某个应用程序的模板,它们应该放在单独的目录中(该目录添加到
settings.py
中的
TEMPLATE\u DIRS

通过设置加载模板;默认情况下,通过浏览
模板目录
来搜索文件系统,然后在任何
模板
目录中搜索已安装的应用程序-这些应用程序按照它们在
已安装的应用程序
中列出的顺序进行搜索

将使用与请求模板匹配的第一个模板。这使得您可以轻松地将默认模板与应用程序一起发布,然后允许最终用户自定义它们;通过创建同名模板并将其放入
template\u DIRS
中列出的目录中


为了避免任何可能的冲突,最好将应用程序名称添加到模板本身;因此,如果您有
index.html
,并且您的应用程序名为
foo
,请将模板更改为
foo_index.html
(默认设置)。

是否不可能以Django提供应用程序的
base.html
首选项的方式进行设置,global或任何其他应用程序的
base.html
,仍然不必硬编码应用程序的名称?我认为你不能在模板上这样做。在视图上,您可以始终将应用程序的名称设置为全局,然后将模板编写为
appname+“/base.html”
@BurhanKahlid:我理解您关于静态文件的观点,并且必须为每个应用程序的模板创建单独的“命名空间”,以避免模板名称冲突。一种方法是按照您的建议,在模板名称中添加应用程序名称。另一种方法是在应用程序的主模板目录下通过应用程序名称创建一个目录。后来似乎成了惯例。看看流行的django注册应用程序。他们似乎遵循后来的惯例。然而,在他们的每个模板中,他们都提到了
{%extend“base.html”%}
。那么,我会说,代表这样一个受欢迎的应用程序来说,这是一个糟糕的做法吗?
django注册
app就在这里:只要你能防止名称空间冲突,就使用任何适合你的方法。每当我需要知道如何最好地做某件事时,我就会看到django是如何做的(因为所有contrib应用程序都是django应用程序),我遵循这个惯例。特别是对于您的示例,模板扩展了其示例应用程序提供的。。我从来不知道“扩展”和“包括”的存在。。