Python 如何在django模板中同时检查if、elif和else条件

Python 如何在django模板中同时检查if、elif和else条件,python,django,Python,Django,我在类别字段中有3个类别。我想在django模板中检查它,并为3个不同的类别分配适当的URL 我试过: {% for entry in entries %} {% if entry.category == 1 %} <a href="{% url 'member:person-list' %}"><li>{{ entry.category }}</li></a> {% elif entry.categ

我在类别字段中有3个类别。我想在django模板中检查它,并为3个不同的类别分配适当的URL

我试过:

{% for entry in entries %}
        {% if entry.category == 1 %}
        <a href="{% url 'member:person-list' %}"><li>{{ entry.category }}</li></a>
        {% elif entry.category == 2 %}          
        <a href="{% url 'member:execomember-list' %}"><li>{{ entry.category}}</li></a>
         {% else %}
         <a href="{% url 'member:lifemember-list' %}"><li>{{ entry.category}}</li></a>
        {% endif %}
{% empty %}
    <li>No recent entries</li>
{% endfor %}
但我知道python只检查第一个与if匹配的条件。因此,它只给出了一个期望的结果。如何获得所有三个条目的正确链接

编辑:


虽然python只检查第一个匹配的if条件,但在for循环中使用elif时,它会检查每个条件,直到endfor循环。因此,我下面的回答很有效

这是我的工作答案:

   {% for entry in entries %}
        {% if entry.category == 'General Member' %}
        <a href="{% url 'member:person-list' %}"><li>{{ entry.category }}</li></a>
    {% elif entry.category == 'Executive Committee Member' %}
        <a href="{% url 'member:execomember-list' %}"><li>{{ entry.category}}</li></a>
    {% else %}
    <a href="{% url 'member:person-list' %}"><li>{{ entry.category}}</li></a>
        {% endif %}
    {% empty %}
        <li>No recent entries</li>
  {% endfor %}
输出的网页视图:

为了获得更多的澄清,我用django shell检查了我的代码。请参见my shell的片段:

即使我改变了if条件的顺序,结果仍然是一样的。请参阅我的shell代码及其输出:


你看到我的密码有什么错误吗?它完全符合python条件,并给出了预期的结果。任何人都可以在django shell上查看

据我所知,您希望根据每个条目在3个类别中所属的类别将其与url关联。您可以在条目模型中进行重构,以最小化模板中的逻辑,如:

class Entry(models.Model):
    category = ...

    def get_entry_url(self):
        if self.category == 'General Member':
            return reverse for the url 'member:person-list'

        elif self.category == 'Executive Committee Member':
            return reverse for the url 'member:execomember-list'

        else:
            return reverse for the url 'member:person-list'
然后在模板中:

{% for entry in entries %}
     <a href="{{ entry.get_entry_url }}"><li>{{ entry.category }}</li></a>
{% empty %}
    <li>No recent entries</li>
{% endfor %}

什么这一点也不清楚。每个entry.category一次只能匹配一个条件。你想要实现什么?非常不清楚,抱歉。但我知道python只检查第一个匹配条件,如果您期望什么?我期望所有三个类别的输出。因为三个类别是不同的,每个类别都有一个单独的列表。所以我想获得所有3个类别的名称及其链接,以获得正确的列表。此列表将从他们的URL获取。我希望你会明白对不起,丹尼尔,我已经得到了我的工作答案。我现在发布了我的答案。在否决我之前,请查看我的答案和django shell代码,并在django shell中尝试它,以检查它是否错误或是否提供了正确的输出。仍然无法理解您试图执行的操作。因此,这实际上与Python完全无关,只检查第一个匹配条件,但事实是你在比较字符串和整数,我贴了一张我的输出图片,并解释了我的答案。不管它是什么,它都为所有3个类别提供了正确的输出。在对我进行下一次投票之前,请在django shell中尝试我的django shell代码,检查它是否有效,并指出我哪里做错了。@ohid关键是您正在使用。每次迭代都会选择一个单独的分支。这并不奇怪。这可能是另一种方法。它能给我比我的答案更好的表现吗?它需要两个地方来使用逻辑:模型和模板,而我的只有一个地方,即我认为代码较少的模板。假设在您的一个视图中,您执行一些逻辑,并且需要一个条目的url重定向到,您将只执行entry.get_entry_url,而不是在需要获取条目url时在整个代码库中编写另一条if…else语句。所以这不仅仅是另一种方法,而是一种重构,减少模板中的逻辑,这是一种很好的实践