【问题标题】:django template inheritance and assingment_tagdjango模板继承和assingment_tag
【发布时间】:2012-08-01 11:02:59
【问题描述】:

我想写一个赋值标签并添加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 在块中定义,但在“内容”块中未定义。

如何使变量在块中可用?

【问题讨论】:

  • 为什么要在模板(表示级别)中获取对象,而不是将其放在呈现此模板的视图(控制器级别)中的上下文中?
  • 嗯...你是对的。可能我需要审查我的申请。谢谢!

标签: django inheritance block extends


【解决方案1】:

这里有两个问题。首先 - 当您处于二级模板(“扩展”基本模板)中时,{% 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 %}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2011-04-12
    • 2011-02-04
    • 2015-11-13
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多