2012-08-01 99 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 %} 

恕我直言,這不是做事情的最好方法,但它的工作原理。這裏的問題是模板修改/覆蓋上下文,並且在某些情況下可能導致不希望的行爲。