如何在我的所有 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.pyTEMPLATES 部分应该是这样的:

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)在哪里?

模板变量,过滤器和静态文件引用

[C++] 智能指针的引用计数如何实现?—— 所有该类的对象共享静态类成员变量

c++中对静态变量的未定义引用

java:在java中为啥静态变量没有this引用?

从多个编译单元引用模板化静态变量时,Clang 链接到不同位置