【问题标题】:Django base.html extension conventionDjango base.html 扩展约定
【发布时间】:2015-03-28 19:15:52
【问题描述】:

对于较新版本的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" %}

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

【问题讨论】:

  • 太棒了..我从来不知道'extends'和'include'存在..

标签: python django django-templates django-views


【解决方案1】:

这与django的新旧版本无关,这与collectstatic命令会覆盖相似名称的文件有关;添加您的应用名称会为您的静态文件创建一个“命名空间”。

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

模板通过TEMPLATE_LOADERS设置加载;并且默认设置是通过 TEMPLATE_DIRS 中的目录搜索文件系统,然后在任何 template 目录中搜索已安装的应用程序 - 按照它们在 INSTALLED_APPS 中列出的顺序进行搜索。

将使用与请求的模板匹配的第一个模板。这使得在您的应用程序中发布默认模板变得容易,然后允许最终用户自定义它们;通过创建具有相同名称的模板并将其放在TEMPLATE_DIRS 中列出的目录中。

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

【讨论】:

  • @BurhanKahlid:我明白你关于静态文件的观点,并且必须为每个应用程序的模板创建一个单独的“命名空间”,以避免模板名称冲突。一种方法是按照您的建议在模板名称中添加应用程序名称。另一种是在应用程序的主模板目录下按应用程序名称创建一个目录。后来好像是约定俗成的。看看流行的django-registration 应用程序。他们似乎遵循后来的约定。但是在他们的每个模板中,他们都提到了{% extend "base.html "%}。那么会说,对于这么受欢迎的应用来说,这是一种不好的做法吗?
  • django-registration 应用在这里:github.com/macropin/django-registration
  • 只要你能防止命名空间冲突,使用任何适合你的东西。每当我需要知道如何最好地做某事时,我都会看到 django 是如何做到的(因为所有 contrib 应用程序都是 django 应用程序)并且我遵循该约定。特别是对于您的示例,模板扩展了随其示例应用程序提供的 base template
【解决方案2】:

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

【讨论】:

  • 难道不能以这样一种方式进行设置,即 Django 将应用程序的base.html 首选项设置为全局或任何其他应用程序的base.html,并且仍然不必对应用程序的名称进行硬编码吗?
  • 我认为你不能在模板上做到这一点。在视图上,您​​始终可以将应用程序的名称设置为全局,然后将模板写为appname + "/base.html"
猜你喜欢
  • 2012-09-27
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2018-06-06
相关资源
最近更新 更多