Skip to main content
 首页 » 编程设计

python之Django base.html 扩展约定

2024年08月26日30unruledboy

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

现在,我应该如何根据较新的应用程序布局访问应用程序 View 中的静态文件和模板?也就是说,在 View 中访问模板名称时,对应用名称进行硬编码是个好主意吗?

def index(request): 
    return render(request, 'blog/index.html', {}) 

同样,在扩展base.html的模板index.html中,需要引用如下:

{% extends "blog/base.html" %} 

同样,这涉及在模板中对应用名称进行硬编码。这是不是一个好主意?如果我决定重命名该应用程序,我将需要对如此多的文件进行更改。

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

的设置
{% extends "base.html" %} 

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

请您参考如下方法:

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

你应该只对静态文件这样做,模板应该放在你的应用程序的主"template"目录中;当然,如果您有不属于应用程序的模板,它们应该放在单独的目录中(添加到 settings.py 中的 TEMPLATE_DIRS)。

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

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

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