1

我想写一个分配标签并添加app/templatetags/app_extras.py

@register.assignment_tag
def get_obj (objid) :
    return get_object_or_404(MyModel, id=objid)

并在模板中

{% extends "index.html" %}

{% load app_extras %}
{% get_obj 1 as obj %}

{% block title %}{{ obj.name }}{% endblock %}
{% block content %}{{ obj.description }}{% endblock %}

变量obj在块中不可见。

如果我写

...
{% load app_extras %}

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}
...

obj 在块中定义,但在“内容”块中未定义。

如何使变量在块中可用?

4

1 回答 1

5

这里有两个问题。首先 - 当您处于二级模板(“扩展”基本模板)中时,外部的内容{% block %}不会被处理。这就是为什么您在块中没有分配值的原因。它确实从未被分配过。

第二个问题是块中的上下文是特定的并且只能在块中访问,而不是在块之间。要使其在多个块中可用 - 您必须共享它。这是如何context使用的assignment_tag

@register.assignment_tag(takes_context=True)
def get_obj (context, objid) :
    context.obj = get_object_or_404(MyModel, id=objid)
    return context.obj

使用此标记,您可以在第一个块中分配变量:

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}

然后在下一个块中从上下文中使用它:

{% block content %}{{ obj.name }}{% endblock %}

恕我直言,这不是最好的做事方式,尽管它有效。这里的问题是模板修改/覆盖了上下文,并且在某些情况下可能导致不良行为。

于 2012-08-01T12:40:59.103 回答