2012-08-01 100 views
1

我想写一个分配标签,并添加app/templatetags/app_extras.pyDjango的模板继承和assingment_tag

@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是在块定义,但在“内容”块不确定。

如何使块中的变量可用?

+1

为什么你想要在templete(表现层)获得对象,而不是把它放在渲染这个模板的视图(控制器级别)的上下文中? – 2012-08-01 11:38:22

+0

嗯......你说得对。可能我需要审查我的申请。谢谢! – lollo 2012-08-01 15:14:25

回答

5

这里有两个问题。首先 - 当您处于二级模板(“扩展”一个基本模板)时,{% block %}之外的内容未被处理。所以这就是为什么你没有在块中分配的值。它从来没有被确定。

第二个问题是块中的上下文是特定的,只能在块中访问,而不能在块之间访问。为了使它在多个块中可用 - 您必须分享它。这是怎么contextassignment_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 %} 

恕我直言,这不是做事情的最好方法,但它的工作原理。这里的问题是模板修改/覆盖上下文,并且在某些情况下可能导致不希望的行为。