【问题标题】:How can I refer to static variables across all of my HTML templates?如何在我的所有 HTML 模板中引用静态变量?
【发布时间】: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,而不是模板标签。

标签: python django


【解决方案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 %}
  1. 在主项目的根目录中创建一个新文件夹“static”。 与“模板”目录相同的级别。

  2. 将此代码添加到您的基本模板文件 (__base.html)。

    {% 加载静态文件 %}

  3. 使用它来加载文件。

  4. 将此添加到您的 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 之类的
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 2019-05-10
  • 2010-12-05
  • 2016-06-06
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多