un3*_*33k 30 tags django templates django-templates
第二次询问更多细节......
我想有一个项目范围的templagetags目录,以便所有应用程序使用通用标记,然后每个应用程序都可以拥有自己的标记,如果需要的话.
让我说我有:
proj1/app1
proj1/app1/templatetags/app1_tags.py
proj1/app2
proj1/app2/templatetags/app2_tags.py
proj1/templatetags/proj1_tags.py
proj1/templates/app1/base.html
proj1/templates/app1/index.html
proj1/templates/app2/base.html
proj1/templates/app2/index.html
Run Code Online (Sandbox Code Playgroud)
哪里:
proj1/templates/app1/base.html
-----------
{% load proj1_tags %}
{% load app1_tags %}
proj1/templates/app1/index.html
-----------
{% extends "base.html" %}
proj1/templates/app2/base.html
-----------
{% load proj2_tags %}
{% load app2_tags %}
proj1/templates/app2/index.html
-----------
{% extends "base.html" %}
Run Code Online (Sandbox Code Playgroud)
这会有用吗?它对我不起作用.它无法找到要加载的proj1_tags.
mip*_*adi 44
我不知道这是否是正确的方法,但在我的Django应用程序中,我总是将常用模板标签放在lib
"app"中,如下所示:
proj/
__init__.py
lib/
__init__.py
templatetags/
__init__.py
common_tags.py
Run Code Online (Sandbox Code Playgroud)
只需确保将lib
应用添加到您的列表INSTALLED_APPS
中即可settings.py
.
Dav*_*ora 20
从Django 1.9开始,不再需要common
像其他人提到的那样创建额外的应用程序.所有你需要做的是一个路径项目中添加templatetags
目录到settings.py
的OPTION['libraries']
字典.
之后,这些标签将在整个项目中可访问.该templatetags
文件夹可以放在您需要的任何位置,也可以有不同的名称.
来自Django文档的自定义示例:
OPTIONS={
'libraries': {
'myapp_tags': 'path.to.myapp.tags',
'project_tags': 'project.templatetags.common_extras',
'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
},
}
Run Code Online (Sandbox Code Playgroud)
Django 为每个应用程序全局注册模板标签INSTALLED_APPS
(这就是您的解决方案不起作用的原因:项目不是Django 理解的应用程序)——它们在所有模板中都可用(前提是它们已正确注册)。
我通常有一个应用程序来处理杂项功能(如网站的起始页)并将与任何特定应用程序无关的模板标签放在那里,但这纯粹是装饰性的。
小智 6
这是您将其放置在settings.py中的位置。
“libraries”中的第一个键(本例中为“custom_tags”)应该是您想要在模板中加载的名称。
项目结构
mysite
- myapp
- mysite
- manage.py
- templatetags
- custom_tags.py
Run Code Online (Sandbox Code Playgroud)
设置.PY
TEMPLATES = [
{
'BACKEND': '....',
'OPTIONS': {
'context_processors': [
...
],
'libraries': {
'custom_tags': 'mysite.templatetags.custom_tags',
}
},
},
]
Run Code Online (Sandbox Code Playgroud)