【问题标题】:Is it possible to load a custom template tag in base and use it in extented templates是否可以在基础中加载自定义模板标签并在扩展模板中使用它
【发布时间】:2024-05-21 11:00:02
【问题描述】:

我在base.html 中加载了一个自定义模板标签note_extras.py

base.html

<div id="wrap">
{% load note_extras %}    
{% block content %}
{% endblock %}
</div><!--wrap-->

但它不能在模板中访问,它是base.html 的扩展,即::

home.html

{% extends "base.html" %}
{% block content %}
<div class="container">
{% create_tagmenu request.user.pk %}
</div>
{% endblock %}

如果我在home.html 中加载note_extras 即可以正常工作:

{% extends "base.html" %}
{% load note_extras %}
....

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    在 Django 模板语言中,您必须在每个模板中加载所有需要的模板库。

    我个人认为这是一个好主意,因为它使模板更加明确(比隐式更好)。我举个例子。在 Django 1.5 之前,url 标签的默认行为是以明文形式提供视图名称以及所有需要的参数:

    {% url path.to.view ... %}
    

    但是没有办法通过上下文变量提供视图的路径:

    {% with var='path.to.view' %}
        {% url var ... %}
    {% endwith %}
    

    为了解决这个问题,从 1.3 开始,您可以通过以下方式导入 url 标签的未来版本(在 1.5 中成为默认):

    {% load url from future %}
    {% url var ... %}
    or
    {% url 'path.to.view' ... %}
    

    现在假设您需要创建一个模板,该模板将扩展自您未创建的基本模板(例如 django 管理基本模板之一)。然后想象在基本模板中它会有{% load url from future %}。因此,您的模板中的{% url path.to.view ... %} 将在没有任何明确解释的情况下失效。

    当然,这个例子不再重要(从 1.5 开始),但希望它说明了在模板中显式比隐式更好的一点,这就是为什么当前的实现是这样的。

    【讨论】:

    • 我也很好奇为什么不允许加载基础模板中的所有标签。也许这在 3 年后发生了变化?
    【解决方案2】:

    如果您希望在每个模板中加载模板标签,您可以在应用的 init 文件中执行此操作:

    from django.template.loader import add_to_builtins
    
    
    add_to_builtins('my_app.templatetags.note_extras')
    

    【讨论】:

      【解决方案3】:

      如果有人想知道,add_to_builtins 已被弃用,但仍然可以通过 settings.TEMPLATES 为项目中的所有模板加载标签 - 支持 Django 1.9 及更高版本,如下所述: https://*.com/a/59719364/2447803

      【讨论】:

        最近更新 更多