如何在我的所有 HTML 模板中引用静态变量?
Posted
技术标签:
【中文标题】如何在我的所有 HTML 模板中引用静态变量?【英文标题】:How can I refer to static variables across all of my HTML templates? 【发布时间】:2020-04-01 07:39:34 【问题描述】:我只是在学习 Django 和 Python,并且想确保我以正确的 DRY 方式做事,而且我确信有一种更简单的方法可以做到这一点......
现在,我有以下 base_template_tags.py
作为它自己的应用程序(添加到 settings.py 并加载到 html 模板 % load ... %
上,这使我可以通过 % cd_year %
和/或以 HTML 标记的形式访问年份电子邮件地址为 cd_email
。它可以工作......但它是一个黑客。
有没有更好的办法?
from datetime import datetime
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
@register.simple_tag
def cd_year():
return datetime.now().year
@register.simple_tag
def cd_email():
return 'pp@pp.com'
【问题讨论】:
now
呢?
哦,对不起......我应该澄清一下......我有一堆我想在应用程序中访问的常量......不仅仅是这个日期。
这个问题的正确答案是context processors,而不是模板标签。
【参考方案1】:
如你所料,django 内置了一种更简单的方法:
% now "Y" %
编辑
正如您在 cmets 中提到的,您希望在所有应用程序之间共享 一组模板标签,您可以覆盖 libraries
字典并在那里添加您的自定义模板标签。
在docs中了解更多信息
对于您的模板:
% load your_template_tags_file_name %
% cd_year %
编辑 2
这就是你的settings.py
的TEMPLATES
部分应该是这样的:
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',
],
'libraries': # <-----------
'global_tags': 'template_tags.global_tags',
'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
,
,
,
]
你的目录结构应该是这样的:
<your_project_dir>
├── __init__.py
├── settings.py
├── template_tags
│ ├── global_tags.py
│ ├── __init__.py
...
global_tags.py
文件应包含您的模板标签定义和注册,如:
from datetime import datetime
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_string):
return datetime.now().strftime(format_string)
@register.simple_tag
def cd_year():
return datetime.now().year
@register.simple_tag
def cd_email():
return 'pp@pp.com'
对于每个将使用这些自定义模板标签的模板:
% load global_tags %
% cd_year %
【讨论】:
所以您想一次性定义所有自定义template_tags
并在所有应用中重复使用它们?
@P'P' 查看this 答案;这是我的首选方式。
也来自docs。
知道了,这就是我现在正在做的事情(作为库添加到 static.py 和 INSTALLED_APPS 中的 TEMPLATES 中)。它有效,但我只是好奇是否存在诸如全局上下文对象之类的东西。即,我将这些定义移至此 template_tags 位,以便不必在各种视图中添加值。我以前有过这个,必须不断重复 -【参考方案2】:
您可以在 .html 中使用以下代码
% block content %
% load staticfiles %
% endblock %
在主项目的根目录中创建一个新文件夹“static”。 与“模板”目录相同的级别。
将此代码添加到您的基本模板文件 (__base.html)。
% 加载静态文件 %
使用它来加载文件。
将此添加到您的 settings.py 文件中。
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
创建全局上下文: 您已经在 context_processor.py 文件中创建了 App 在 context_processor 文件中写入:
from app.model import *
from django.contrib.auth.models import user
def employee_processor(request):
try:
emp_obj= Employees.object.filter(user=request.user)
return ’employee’:emp_obj
except:
user_obj=User.object.filter(id=request.user)
return ’employee’: user_obj
在设置 py 文件中添加上下文处理器:
TEMPLATES = [
# whatever comes before
'OPTIONS':
'context_processors': [
# whatever comes before
"your_app.context_processors.employee_processor",
],
]
然后你可以在你的 HTML 模板中使用全局变量
employee
employee.name
【讨论】:
谢谢。如何获取存储在这些静态文件中的常量?我真的在寻找合适的地方来定义全局常量.. 比如email
之类的以上是关于如何在我的所有 HTML 模板中引用静态变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉我的 django 模板静态文件(dajax.core.js)在哪里?