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在块中定义,但在"内容"块中未定义.
如何在块中使变量可用?
这里有两个问题.首先 - 当您处于二级模板("扩展"基础模板)时,{% 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)
恕我直言,这不是最好的做事方式,虽然它有效.这里的问题是模板修改/覆盖上下文,并且在某些情况下可能导致不期望的行为.