我想根据变量是否存在来为变量分配不同的值,这可能吗?我的非工作示例可能会更清楚:
{% if username %}
{% with menu_user=username %}
{% elif recent_users %}
{% with sorted_users=recent_users|dictsortreversed:"timestamp" %}
{% with menu_user=sorted_users.0.username %}
{% endif %}
{% if menu_user %}
<div id="menu">
<ul>
<li><a href="/user/{{ menu_user|urlencode }}">Profile</a></li>
<li><a href="/user/{{ menu_user|urlencode }}/products/">Products</a></li>
</ul>
</div>
{% endif %}
{% if recent_users %}
{% endwith %}
{% endif %}
{% endwith %}
我尝试做的伪代码:
if username:
menu_user = username
elif recent_users:
menu_user = sorted(recent_users)[0]['username']
if menu_user:
<div id="menu">
<ul>
<li><a href="/user/{{ menu_user|urlencode }}">Profile</a></li>
<li><a href="/user/{{ menu_user|urlencode }}/products/">Products</a></li>
</ul>
</div>
答案 0 :(得分:6)
更新 然后更好地自定义模板标签,如
@register.inclusion_tag('menu_snippet.html') # or you could use takes_context=True and fetch values from the context
def render_menu(username, recent_users):
if username:
menu_user = username
elif recent_users:
# sorted here could be replaced by min or QuerySet method, it depends
# for example:
# menu_user = min(recent_users, key=lambda u:u.timestamp).username
menu_user = sorted(recent_users)[0]['username']
return {'menu_user':menu_user}
# in template, it looks like
{% render_menu username recent_users %}
将代码放在视图中要好得多。正如您的伪代码一样,干净且可读。
如果你还想写模板,我更喜欢像
这样的东西{% if username %}
<div id="menu">
<ul>
<li><a href="/user/{{ username|urlencode }}">Profile</a></li>
<li><a href="/user/{{ username|urlencode }}/products/">Products</a></li>
</ul>
</div>
{% else %}
{% if recent_users %}
{% with sorted_users=recent_users|dictsortreversed:"timestamp" %}
{% with menu_user=sorted_users.0.username %}
<div id="menu">
<ul>
<li><a href="/user/{{ menu_user|urlencode }}">Profile</a></li>
<li><a href="/user/{{ menu_user|urlencode }}/products/">Products</a></li>
</ul>
</div>
{% endwith %}{% endwith %}
{% endif %}
{% endif %}
取决于您的实际使用情况,自定义模板标记或包含标记也可能有用。
答案 1 :(得分:1)
模板标签:
@register.assignment_tag
def alias(obj):
"""
Alias Tag
"""
return obj
模板:
{% alias sorted_users.0.username as menu_user %}
答案 2 :(得分:0)
创建一个模板标记,将username和recent_users作为参数,然后输出菜单。这样你就可以保持你的模板不受那种逻辑的影响。