是否可以在基础中加载自定义模板标记并在扩展模板中使用它

时间:2013-12-13 06:11:57

标签: python django django-templates

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

base.html文件

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

但是在base.html ie ::

的扩展名的模板中无法访问它

home.html的

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

如果我在note_extras加载home.html

,它工作正常
{% extends "base.html" %}
{% load note_extras %}
....

3 个答案:

答案 0 :(得分:4)

在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开始),但希望它说明了模板中显式优于隐式的一点,这就是当前实现的原因。

答案 1 :(得分:1)

如果您希望在应用的 init 文件中为每个模板加载模板标记:

from django.template.loader import add_to_builtins


add_to_builtins('my_app.templatetags.note_extras')

答案 2 :(得分:1)

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