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



我在使用block.super.以DRY方式实现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,我可以根据版本的来源继承适当的面包屑。但我只得到过版本的面包屑,即使我希望得到调查/版本的面包碎屑。这是挂在"edition"后面的模板"create":

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

我总是可以在该模板中放入另一个if:else:,但我宁愿从上一个模板中继承if:elser:。我不明白是什么?我需要把子弹传回超级:盖帽还是什么的?如果:else:在子模板中,我如何在不重复相同的if的情况下做到这一点?事实上,即使有了一个新的if,我该如何做到这一点:否则:?

感谢

John

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

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

最新更新