3

我知道我们可以在模板中使用“扩展变量”在两个不同的扩展模板之间切换。例如

  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

4

4 回答 4

5

如果只有 2 个(或 3 个)选项可以将“某物”设置为布尔值,那么您可以使用 yesno 过滤器: https ://docs.djangoproject.com/en/dev/ref/templates/builtins/#是的

所以:

{% extends something|yesno:"base1.html,base2.html" %}

如果您想要更自由的形式,那么您可以使用上面提到的额外上下文/自定义上下文处理器选项,并尝试以下操作:

{% extends selected_template|default:"base2.html" %}

其中所选模板只是您喜欢的任何基本模板的路径。

于 2012-11-07T16:28:36.767 回答
4

老实说,这在我看来就像代码异味——我使用过 django-registration 几次,我在相当大的网站上工作,而且我从不需要从另一个仅在运行时知道的模板扩展模板。

无论如何,如果您真的想将自定义变量传递给由 3rd 方模块呈现的模板,并且您不想破解该模块,那么您必须使用例如自定义模板上下文处理器。此外,django-registration 允许extra_context传递给它的视图,也许这就足够了。您也可以尝试猴子补丁。或者,也许您可​​以尝试操作模板文件夹或模板加载器来获取您需要的内容。

但是所有这些东西都是恕我直言,你不应该为一个视图使用不同的模板,除非它是一个通用视图。

于 2011-02-26T12:01:40.410 回答
2

我认为您不应该将模板之间的差异放入不同基本模板的选择中。拥有不同的基本模板是违反 DRY 原则的。将常见的东西放入模板中,即。registration.html,与您通过“包含”调用的其他模板的区别:

{%extends base.html%}

{%if something%}
    {%include "type1.html"%}
{%else%}
    {%include "type2.hmtl"%}  

其中模板名称与您在视图定义中使用的相同。

于 2011-02-26T10:26:26.397 回答
0

这可能不是您要寻找的,但是您可以将条件包含在 base.html 中吗?

于 2011-02-26T10:24:10.210 回答