% extends "base.html" % 和 % block content % 在 if 语句中(Django 应用程序)

Posted

技术标签:

【中文标题】% extends "base.html" % 和 % block content % 在 if 语句中(Django 应用程序)【英文标题】:% 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 并通过上下文将其发送到您的模板? 【参考方案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 块内使用。也许你应该考虑使用其他方式来做到这一点。这是合理的,因为你最好不要在模板中做逻辑事情。

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

【讨论】:

我完全听到你在我的模板中不使用逻辑。

以上是关于% extends "base.html" % 和 % block content % 在 if 语句中(Django 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

模板继承

带有 % extends 的每页上的 Django 页脚和页眉

9模板语言继承使用

0527总结

0527总结

Django-4