据我所知,我们可以在模板中使用“extends variable”来切换两个不同的扩展模板。 e.g。
views:
if something:
base = 'base1.html'
else:
base = 'base2.html'
return render_to_response ('template.html', {'base':base})
template.html:
{% extends base %}
通常情况下工作正常。但是,我的问题是我使用的是django-registration,我没有编写自己的视图来处理注册和登录过程。这也意味着我无法将变量传递给模板。虽然我的项目目录下有注册模板。 (如login.html)
不幸的是,Django无法在模板中执行此操作:
{% if something %}
{% extends 'base1.html' %}
{% else %}
{% extends 'base2.html' %}
{% endif %}
我知道'变量库'可以传递给auth-login的唯一方法是编写自己的视图,如登录,注销等。这似乎不适合DRY模型,并且相当容易出错。
还有其他方法可以实现这一目标吗?或任何解决问题的指针?
感谢。
-P
答案 0 :(得分:4)
说实话,这对我来说就像一个代码味道 - 我已经使用了django-registration几次,我在相当大的网站上工作,我从来不需要从另一个模板扩展模板,这只是在运行时才知道
无论如何,如果你真的想将自定义变量传递给第三方模块呈现的模板,并且你不想破解该模块,那么你必须使用例如自定义template context processor。此外,django-registration允许extra_context
传递给它的视图,也许这就足够了。你也可以尝试猴子修补。或者您可以尝试操作模板文件夹或模板加载器以获得所需的内容。
但是所有这些都是恕我直言,你不应该为一个视图使用不同的模板,除非它是一般视图。
答案 1 :(得分:4)
如果只有2(或3)个选项可以对布尔值进行'某事',那么你可以使用yesno过滤器: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno
所以:
{% extends something|yesno:"base1.html,base2.html" %}
如果你想要更多自由形式的东西,那么你可以利用上面提到的额外的上下文/自定义上下文处理器选项,并尝试类似的东西:
{% extends selected_template|default:"base2.html" %}
其中所选模板只是您喜欢的任何基本模板的路径。
答案 2 :(得分:1)
这可能不是您想要的,但您可以在base.html中包含您的条件吗?
答案 3 :(得分:1)
我认为您不应将模板之间的差异放入不同基本模板的选择中。拥有不同的基本模板违反了DRY原则。将常见事物放入模板中,即。 registration.html,与您通过'include'调用的其他模板的差异:
{%extends base.html%}
{%if something%}
{%include "type1.html"%}
{%else%}
{%include "type2.hmtl"%}
其中模板名称与您在视图定义中使用的名称相同。