Python 在Django中有条件地扩展模板

Python 在Django中有条件地扩展模板,python,django,django-templates,Python,Django,Django Templates,我在Django网站上有一个下载页面,我想为登录和未登录的用户提供服务。我希望有一个单独的download.html,有条件地扩展正确的基础,而不是让用户_download.html和登录_download.html 然而,当我使用下面的代码时,我得到了一个错误 {% if user.is_authenticated %} {% extends 'user_base.html' %} {% else %} {% extends 'login_base.html' %} {% endif

我在Django网站上有一个下载页面,我想为登录和未登录的用户提供服务。我希望有一个单独的download.html,有条件地扩展正确的基础,而不是让用户_download.html和登录_download.html

然而,当我使用下面的代码时,我得到了一个错误

{% if user.is_authenticated %}
  {% extends 'user_base.html' %}
{% else %}
  {% extends 'login_base.html' %}
{% endif %}

{% block content %}
<h2>Downloadable content</h2> 
...
{% endblock %}
{%if user.u经过身份验证%}
{%extends'用户_base.html%}
{%else%}
{%extends'登录名\u base.html%}
{%endif%}
{%block content%}
可下载内容
...
{%endblock%}
我收到的错误是 TemplateSyntaxError位于/下载/

无效的块标记:“else”

还有什么问题吗?我试过了

{% if user.is_authenticated %}
  {% extends 'user_base.html' %}
{% else %}{% if AnonymousUser.is_authenticated %}
  {% extends 'login_base.html' %}
{% endif %}{% endif %}

{% block content %}
<h2>Downloadable content</h2> 
...
{% endblock %}
{%if user.u经过身份验证%}
{%extends'用户_base.html%}
{%else%}{%if AnonymousUser.is_authenticated%}
{%extends'登录名\u base.html%}
{%endif%}{%endif%}
{%block content%}
可下载内容
...
{%endblock%}
但这也没用

谢谢,
erip

您得到一个错误,因为需要在模板顶部定义
扩展
extends
控制模板继承:您基本上是从某个父类创建一个子类,这就是为什么
extends
需要成为模板中的第一件事

想象一下编写一个类,在
\uuuu init\uuuu()
中,您说

class DoesntKnowWhereToInheritFrom(object):

    def __init__():
        if something:
            self.inherits_from(x)
        else
            self.inherits_from(y)
编译器/解释器会发疯的


通常的方法是在
视图中检查
是否经过身份验证,然后呈现相应的模板。

标记
{%extends%}
支持变量。请参阅以供参考

def my_view(request):
   if request.user.is_authenicated
       base_template_name = 'user_base.html'
   else:
       base_template_name = 'login_base.html'

   # Pass base template name to the renderer
   return render_to_response('your_template.html', {'base_template_name':base_template_name})
模板(请注意,未引用该值):


处理这种情况的正常方法是使用两个单独的模板,并检查它们是否在
视图中经过身份验证,然后呈现相应的模板。@mattm我之前就是这样做的,但我想知道是否有更好的方法来避免多个文件。如果没有更好的方法,我将继续这样做。在
视图中执行操作是“如何完成”。您尝试执行的操作不起作用的原因是您需要在模板的开头定义
扩展。想象一下,编写一个作为子类的类,但不在一开始指定它继承自的类。你基本上也在做同样的事情,这是有道理的。如果你把它作为一个答案,我会把它标记为已回答。基本上这并不能回答问题。
{% extends base_template_name %}
...