django模板继承和assingment_tag

lol*_*llo 1 django inheritance extends block

我想写一个赋值标签并加入 app/templatetags/app_extras.py

@register.assignment_tag
def get_obj (objid) :
    return get_object_or_404(MyModel, id=objid)
Run Code Online (Sandbox Code Playgroud)

并在模板中

{% extends "index.html" %}

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

{% block title %}{{ obj.name }}{% endblock %}
{% block content %}{{ obj.description }}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

变量obj在块中不可见.

如果我写

...
{% load app_extras %}

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}
...
Run Code Online (Sandbox Code Playgroud)

obj在块中定义,但在"内容"块中未定义.

如何在块中使变量可用?

Tis*_*sho 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
Run Code Online (Sandbox Code Playgroud)

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

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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

{% block content %}{{ obj.name }}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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