【问题标题】:Check if object is in manytomany list in template检查对象是否在模板中的多列表中
【发布时间】:2013-07-12 08:57:48
【问题描述】:

如何检查某个对象/id 是否在列表中?

如果连接对象的 ID 不是“6”,我希望显示一些内容。

尝试过这样的事情:

 {% if user.benefits.all != "6" %}
    You do not have a benefit with ID 6.
 {% endif %}

【问题讨论】:

    标签: django django-templates


    【解决方案1】:
    {% for benefit in user.benefits.all %}
        {% if benefit.id != 6 %}
            You do not have a benefit with id 6
        {% endif %}
    {% endfor %}
    

    但这会遍历所有的好处,并在每次条件通过时打印出来。

    所以,你应该编写一个模板标签,它会返回一个特定用户的所有好处的 id 列表,一旦你有了这个列表,你就可以这样做:

    {% if 6 not in list_of_benefit_ids %}
        You do not have a benefit with id 6
    {% endif %}
    

    【讨论】:

    • 好的,我希望我可以跳过另一个 for 循环。但你猜不是。
    • @Garreth00 您应该在视图中而不是在模板中执行此检查。你应该总是把“过滤”的数据放到模板中。
    【解决方案2】:

    最好不要在模板中加入太多逻辑。视图(或模型) - 是一个更好的地方。

    例如,您可以通过以下代码检查 user.benefits 具有 id=6 的元素:

    has_benefit = user.benefits.filter(id=6).count() > 0
    context['has_benefit'] = has_benefit
    

    现在在模板中使用这个新的上下文变量:

    {% if not has_benefit %}
        You do not have a benefit with ID 6.
    {% endif %}
    

    更新

    如果你还想在模板中做,最好创建一个custom template filter

    from django import template
    register = template.Library()
    
    @register.filter(name='has_benefit')
    def has_benefit(user, benefit_id):
        b_id = int(benefit_id)
        return user.benefits.filter(id=b_id).count() > 0
    

    现在在模板中使用{% load module_name %} 加载您的模板标签模块并使用:

    {% if not user|has_benefit:"6" %}
        You do not have a benefit with ID 6.
    {% endif %}
    

    【讨论】:

    • 谢谢!我想我会尝试在视图中执行此操作。
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多