% 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>,
% 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>,
% 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 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章