Django `ifnotequal` 标签
我想用 ifnotequal
标签来判断一个变量是否等于某个特定的值。这是我的代码:
{% ifequal firewall.to_port 22 %} <td>Ssh Service</td>{% endifequal %}
{% ifequal firewall.to_port 80 %} <td>Web Service</td>{% endifequal %}
{% ifequal firewall.to_port 25 %} <td>Mail Service</td>{% endifequal %}
{% ifnotequal firewall.to_port 80 or 22 or 25 %} <td>Unknown Service</td>{% endifnotequal %}
这段代码是错的。我不知道怎么在 ifnotequal
标签中使用 or
。我该怎么写呢?非常感谢。
最后,我使用了:
{% ifequal firewall.to_port 22 %} <td>Ssh Service(Port 22)</td>{% endifequal %}
{% ifequal firewall.to_port 80 %} <td>Web Service(Port 80)</td>{% endifequal %}
{% ifequal firewall.to_port 25 %} <td>Mail Service(Port 25)</td>{% endifequal %}
{% if firewall.to_port != 25 and firewall.to_port != 22 and firewall.to_port != 80 %}
<td>Unknows Service</td>{% endif %}
这看起来有点傻。
2 个回答
0
在你把对象发送到模板之前,最好在视图中先处理好,这样更简单,而且性能也更好:
def some_view(request):
port_names = {22: 'SSH Service', 80: 'Web Service', 25: 'SMTP Service'}
firewall_objects = Firewall.objects.all()
object_list = []
for firewall in firewall_objects:
object_list.append((firewall,
port_names.get(firewall.to_port, 'Unknown Service')))
return render(request, 'template.html', {'object_list': object_list})
现在在你的模板中,事情就变得简单多了:
<ul>
{% for obj, description in object_list %}
<li>{{ obj.to_port }} - {{ description }}</li>
{% endfor %}
</ul>
2
一种方法是使用 if
模板标签,而不是 ifequal
。这样可以有多个 elif
条件,还有一个最后的 else
条件,如果之前的 elif
条件都不满足,就会用这个 else
。比如:
{% if firewall.to_port==22 %} <td>Ssh Service</td>
{% elif firewall.to_port==80 %} <td>Web Service</td>
{% elif firewall.to_port==25 %} <td>Mail Service</td>
{% else %} <td>Unknown Service</td>{% endif %}
根据你的 to_port
调用的工作方式,你可能需要用字符串来比较,而不是用整数。
在查看Henrik Andersson在上面评论中发的重复链接时,我发现那里已经有人建议了这种方法。这不是唯一的选择,但如果你不想改变你的视图/模型实例的行为,这个方法是可行的。