2015-05-28 6 views
0

Есть ли способ фильтровать при использовании {% for%} в шаблоне? Например, я получил это:Отфильтровать модель с использованием «для» в Django

Модели:

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 %} 

Есть ли способ сделать это? Если вы не понимаете что-то просто спросите :)

+1

Вы ищете тег [ifequal] (https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#ifequal) или '=='? –

+0

Нет, я ищу фильтр, например model.objects.filter (field = "something"), но который можно использовать на шаблоне, и получить его? –

ответ

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.

+0

Это сработало, но оно, похоже, не вернуло True, даже если они равны, любая идея? –

1

Я думаю, что вы приближаетесь к этому с неправильного угла. Логика должна идти в представлениях.

Кажется, что вы хотите группировать свои продукты по типу, поэтому, когда вы указываете свой запрос в своем представлении для продуктов, используйте порядок.

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

Затем в шаблоне вам нужно будет только внутренний цикл

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

Теперь ваши продукты будут упорядоченный опциями.

Или я что-то упускаю?

+0

Правильно, но у меня есть меню, которое фильтрует по типу, поэтому, если он нажимает тип 1, он должен показывать только этот тип и другие, это то, что я пытаюсь выполнить. –

+0

Выполняете фильтрацию в JavaScript? Или в Django? Если его в Django передать фильтр в набор запросов в представлении. –

Смежные вопросы