Фильтрация query_set Джанго в шаблоне


Я могу сделать мой синтаксис шаблона проще? Я надеюсь устранить , если и может быть, и для блока.

Это работает в командной консоли, но я не могу выяснить синтаксис шаблона.

recipes[0].recipephotos_set.get(type=3).url

model.py

class Recipe(models.Model):
    ....

class RecipePhotos(models.Model):
    PHOTO_TYPES = (
    ('3', 'Sub Featured Photo: 278x209'),
    ('2', 'Featured Photo: 605x317'),
    ('1', 'Recipe Photo 500x358'),
    )
    recipe = models.ForeignKey(Recipe)
    url = models.URLField(max_length=128,verify_exists=True)
    type =  models.CharField("Type", max_length=1, choices=PHOTO_TYPES)

view.py

recipes = Recipe.objects.filter(recipephotos__type=3)

template.html

{% for recipe in recipes %}

      {% for i in recipe.recipephotos_set.all %} 
          {% if i.type == '3' %}
              {{ i.url }}
          {% endif %}
      {% endfor %}

  <a href="/recipe/{{ recipe.recipe_slug }}/">{{ recipe.recipe_name }}</a></li>

{% empty %}


Комментарии
1 ответ

Я отсылаю вас к переполнение стека пост , который в значительной степени гвоздями ответа.

Я предполагаю, что вы хотите отобразить все рецепты, которые есть "под фотографии".

Вызов рецепты = Рецепт.объекты.фильтр(recipephotos__Тип=3) даст вам объект QuerySet рецептов, которые имеют по крайней мере одно фото с типом 3. До сих пор так хорошо. Обратите внимание, что этот код находится в файле views.py и не в шаблоне. Как упомянуто сайте StackOverflow пост, вы должны поместить код фильтрации с вашей точки зрения или модели.

Лично я предпочитаю писать функцию для вашей модели класса:

class Recipe(models.Model):
(...)
def get_subfeature_photos(self):
return self.recipephotos_set.filter(type="3")

И доступ к нему в шаблоне так:

{% for recipe in recipes %}
{% for photo in recipe.get_subfeature_photos %}
{{ photo.url }}
{% endfor %}
(...)
{% endfor %}

Пожалуйста, обратите внимание, что функция использует фильтр() для нескольких элементов, а не вам(), который возвращает только один элемент и бросает MultipleObjectsReturned исключение, если есть больше.

8
ответ дан 30 января 2011 в 08:01 Источник Поделиться