【问题标题】:Breaking out of a for loop from a nested if statement in Django从 Django 中的嵌套 if 语句中跳出 for 循环
【发布时间】:2015-08-16 18:02:59
【问题描述】:

有没有办法从if 语句中打破这个for 循环。目前我们的数据库错误地存储了多个主电话,我想在找到第一个主电话后跳出 for 循环。提前感谢您的帮助。

{% for phone in user_phones %}
    {% if phone.primary %}
        <div>{% if phone.type %}{{ phone.type|title }}: {% endif %}<span itemprop="telephone">{{ phone.phone_format }}</span></div>
    {% endif %}
{% endfor %}

更新:

或者通过在if true 分支中创建一个变量来使if 条件失败

【问题讨论】:

  • 这听起来更像是业务逻辑而不是 ui/模板问题。我建议在您的视图中准备一个特定的上下文变量。
  • @Wtower 那个问题不一样

标签: django


【解决方案1】:

如果您必须留在模板层内,您可以使用regroup

{% regroup user_phones|dictsort:"primary" by primary as phones_list %}

{% for phone in phones_list %}
    {% if phone.grouper %}
    {{ phone.list.0.type }}
    {% endif %}
{% endfor %}

它的作用

regroupdictsort 过滤器(也适用于查询集)一起按primary 的值对user_phones 中的实例进行分组。

regroup 将添加一个名为grouper 的属性,当按boolprimary 的值)分组时,该属性将是TrueFalse

for 然后遍历由regroup 提供的变量phones_list。由于我们已经按primary 对结果进行了排序,所以{% if phone.grouper %} 会告诉我们何时我们用primary == True 击中了这组项目。

regroup 将属于一个组的项目打包到属性list 中。所以第一项可以通过phone.list.0.typephone.list.0.phone_format等访问。

注意:
如果您需要多次访问foo.list.0,可以将其分配给一个变量(使用with):

{% regroup user_phones|dictsort:"primary" by primary as phones_list %}

{% for items in phones_list %}
    {% if items.grouper %}
    {% with items.list.0 as phone %}
    <div>{% if phone.type %}{{ phone.type|title }}: {% endif %}<span itemprop="telephone">{{ phone.phone_format }}</span></div>
    {% endwith %}
    {% endif %}
{% endfor %}

【讨论】:

    【解决方案2】:

    Django 模板中没有break。您可以在视图中处理它,方法是将您要查找的primary phone 存储到一个变量中,然后在您的模板中调用它。

    【讨论】:

    • 所以没办法from inside the if statement?
    • @Dusty:不,在 Django 模板 for 循环中无法使用 break。在将数据传递给模板之前,您必须对其进行处理。
    • @Dusty 是的,没有办法。你应该在views.py处理它。
    • 你能在Django的for循环中定义变量吗?
    • 你不能。您应该在 py 文件中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多