使用DRY原则在django中使用block.super扩展面包屑

时间:2014-10-24 07:15:39

标签: django templates

我无法使用block.super以干燥的方式实现django_breadcrumbs。

我有一个模板"版本"用户可以通过以下两种方式之一访问:在家中,在这种情况下,用户可以看到所有版本,或者从模板"调查",在这种情况下,用户只能看到该调查的版本。 版本模板的面包屑看起来像这样,它们工作正常:

{% extends 'base.html' %}
{% load django_bootstrap_breadcrumbs %}
{% block breadcrumbs %}
    {{ block.super }}
    {% if slug %}
        {% breadcrumb "Surveys" "surveys:index" %}
        {% breadcrumb "Editions" "editions:index" slug=slug %}
    {% else %}
        {% breadcrumb "Editions" "editions:index" %}
    {% endif %}
{% endblock %}

对于挂起版本模板的网页,会出现令人失望的情况。我希望通过扩展该页面并使用block.super,我会根据版本的来源继承正确的面包屑。但即使我希望使用Surveys / Editions面包屑,我也只能获得Editions面包屑。 这是模板"创建"这就是"版本":

{% extends 'editions/index.html' %}
{% load bootstrap3 %}
{% load django_bootstrap_breadcrumbs %}
{% block breadcrumbs %}
    {{ block.super }}
    {% breadcrumb "Create" "editions:create" %}
{% endblock %}

我总是可以在该模板中添加另一个if:else:但我宁愿只从前一个模板继承if:else :.什么是我不明白?我是否需要将slu to传递回super:block或者什么东西?如果不重复相同的if:else:在子模板中,我该怎么做?实际上,即使使用新的if:else:?

,我将如何做到这一点

感谢

约翰

1 个答案:

答案 0 :(得分:0)

我最好的猜测是你渲染第二个模板而不传递slug变量。您的继承是正确的,但是当父(或超级)模板使用slug变量时,它呈现的内容取决于变量的内容。因此,如果没有传递名为slug的变量,您将始终获得if语句的else部分。

因此,解决方案似乎很简单:在触发模板渲染时将slug变量添加到context参数中。