Django `ifnotequal` 标签

0 投票
2 回答
1870 浏览
提问于 2025-04-18 11:33

我想用 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在上面评论中发的重复链接时,我发现那里已经有人建议了这种方法。这不是唯一的选择,但如果你不想改变你的视图/模型实例的行为,这个方法是可行的。

撰写回答