在Django中使用“for”过滤模型

时间:2015-05-28 18:38:30

标签: python django filter many-to-many

在模板中使用{%for%}时有没有办法过滤? 例如,我得到了这个:

型号:

class Options(models.Model):
    option = models.CharField(max_length=50)

class Brand(models.Model):
    brand = models.CharField()

class Products(models.Model):
    type = models.ForeignKey(Options)
    brand = models.ManyToManyField(Brands)

在模板中:

{% for article in Options %}
    {% for sth in products where type=article.0 %} <--- Is this possible ?
                                                        I need to make it iterable
         //Do something
    {% endfor %}
{% end for %}

有办法吗? 如果您不明白某事,请问:)

2 个答案:

答案 0 :(得分:1)

我认为你是从错误的角度接近这个。像这样的逻辑应该在视图中。

您似乎希望按类型对产品进行分组,因此无论您在产品的视图中指定查询集,请使用order by。

queryset = Products.objects.filter(filters_here_if_you_need=any).order_by("type__option")

然后在你的模板中你只需要内循环

{% for sth in products  %} 
     //Do something
{% endfor %}

现在您的产品将通过选项订购。

或者我错过了什么?

答案 1 :(得分:0)

实际上有很多选择

{% for thing in things %}
    {% for product in products.all %}
        {% if thing.type == product.type %}
            <!-- do stuff -->
        {% else %}
            <!-- pass -->
        {% endif %}
    {% endfor %}
{% end for %}

{% for thing in things %}
    {% for product in products.all %}
        {% ifequal thing.type product.type %}
            <!-- do stuff -->
        {% else %}
            <!-- pass -->
        {% endifequal %}
    {% endfor %}
{% end for %}

可以编写SimpleTag来直接在您的模板中过滤您的相关经理,但我不会推荐它。您还可以向采用参数的模型中的任一个添加属性,并使用简单标记来提供模板中的方法。

如果您的数据不是那么动态,您也可以直接将正确的context返回到您的模板。