【问题标题】:{% extends "base.html" %} and {% block content %} inside if statement (Django app){% extends "base.html" %} 和 {% block content %} 在 if 语句中(Django 应用程序)
【发布时间】:2016-02-14 05:47:13
【问题描述】:

在 Django 模板中,我想向经过身份验证和未经身份验证的用户显示不同的内容。

具体来说,如下所示:

{% if not user.is_authenticated %}
    <div class="margin">
    {{ group.topic }}
    </div>
{% else %}
    {% extends "base.html" %}
    {% load humanize %}
    {% block content %}
    <div class="margin">
        {{ group.topic }}
        <br>
        <b>members:</b>
            {% for member in members %}
            <a href="{% url 'profile' slug=member.username %}">{{ member.username }}</a>,&nbsp;
            {% endfor %}
        <hr size=1>
        <form action="{% url 'private_group_reply' slug=unique %}" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="hidden" id="id_link" name="unique" class="hidden_id" value="{{ unique }}">
            <br>{{ form.image }}<br>
            <br>{{ form.text }}<br>
            <input class="button" type="submit" value="OK" id="id_submit">
        </form>
        {% for reply in replies %}
        {{ reply.writer }}: {{ reply.text }},{{ reply.submitted_on|naturaltime }}<br>
        {% endfor %}

    {% endblock %}
{% endif %}

换句话说,我只想为经过身份验证的用户扩展 base.html,对于未经过身份验证的用户,我想要一个普通的模板。

我不断收到 TemplateSyntaxError: invalid block tag {% endif %}

我怎样才能做到这一点?

有问题的应用是旧版 Django 应用,使用 Django 1.5

【问题讨论】:

  • 这是您的实际代码吗?
  • 不,这是一种简化。
  • 我认为您缺少 {% extends "base.html"} 行中的结束 '%'
  • 哦不,这是我在这里写的时候打错了。让我纠正一下。事实上,我会用实际的代码 sn-p 来更新问题。
  • 我认为您的问题是扩展,您为什么不在视图中定义扩展的 html 并通过上下文将其发送到您的模板?

标签: python django django-templates


【解决方案1】:

{% extends var %} 必须始终是模板中的第一个标签。

您可以使用空模板并将其扩展为您的目的。 尝试反转逻辑并将块拉出到顶层:

empty.html

{% block content %}
{% endblock %}

您的文件.html

{% extends user.is_authenticated|yesno:"base.html,empty.html" %}
    {% load humanize %}
    {% block content %}
    {% if not user.is_authenticated %}
    <div class="margin">
    {{ group.topic }}
    </div>
{% else %}
    <div class="margin">
        {{ group.topic }}
        <br>
        <b>members:</b>
            {% for member in members %}
            <a href="{% url 'profile' slug=member.username %}">{{ member.username }}</a>,&nbsp;
            {% endfor %}
        <hr size=1>
        <form action="{% url 'private_group_reply' slug=unique %}" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="hidden" id="id_link" name="unique" class="hidden_id" value="{{ unique }}">
            <br>{{ form.image }}<br>
            <br>{{ form.text }}<br>
            <input class="button" type="submit" value="OK" id="id_submit">
        </form>
        {% for reply in replies %}
        {{ reply.writer }}: {{ reply.text }},{{ reply.submitted_on|naturaltime }}<br>
        {% endfor %}
{% endif %}
{% endblock %}

【讨论】:

  • 我认为这里的最佳解决方案。快速调整一下:{% extends user.is_authenticated|yesno:"base.html,empty.html" %} 为我工作,而不是 {% extends user.is_authenticated|yesno:"base.html","empty.html" %}。为了完整起见,您可能需要在答案中进行修改。
  • 我也应该说我认为这是一个 hack。
【解决方案2】:

我认为 extends 不能在 if 块内使用。也许你应该考虑使用其他方式来做到这一点。这是合理的,因为你最好不要在模板中做逻辑事情。

其他解决方案会像,例如,根据用户是否登录来渲染不同的模板文件。

【讨论】:

  • 我完全听到你在我的模板中不使用逻辑。
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多