Цикл по списку объектов в шаблоне Django - PullRequest
8 голосов
/ 05 сентября 2011

Не могу понять, где я иду не так здесь. Прости меня, потому что я новичок в этом. Я пытаюсь отобразить 10 новейших объектов в модели.

Вот цикл, который я использовал для помещения всех этих объектов в список:

 # put the top 10 newest Recipe objects in a list   
    entries_list = []
    all_recipes = Recipes.objects.annotate(Count('id'))
    newest_recipe_index = len(all_recipes)
    index = 0
    while index < 10:
        try:
            x = Recipes.objects.get(id=newest_recipe_index)
            entries_list.append(x)
            newest_recipe_index = newest_recipe_index - 1
            index = index + 1
        except:
            index = index + 1
            pass

Затем я отображаю это на странице следующим образом:

 c = RequestContext(request, {'form' : form, 'entries_list' : entries_list})
    return render_to_response("main.html", c)

А вот мой HTML:

{% for entries in entries_list %}
        <i><b>Name:</i></b> {{ entries_list.name }}<br>
        <img src="/images{{ entries_list.picture }}" height="300" width="300"></img><br>
        <i><b>Ingredients:</i></b> {{ entries_list.ingredients }}<br>
        <p><i>{{ entries_list.description }}</i></p>
        <i><b>Created by:</i></b> {{ entries_list.user }}<br><br>
    {% endfor %}

А вот models.py:

class Recipes(models.Model):
    name = models.CharField(max_length=50)
    ingredients = models.CharField(max_length=300)
    picture = models.ImageField(upload_to = 'recipes/%Y/%m/%d')
    user = models.CharField(max_length=30)
    date = models.DateTimeField(auto_now=True)
    description = models.TextField()    
    comments = models.ManyToManyField(Comments)

Кажется, что цикл работает. Правильное количество записей там. Просто теги шаблонов не работают. Они просто пустые. Таким образом, кажется, что это нормально работает, помещая объекты в список, просто не получит мои отдельные поля.

Ответы [ 2 ]

8 голосов
/ 05 сентября 2011

Пара вещей.Существует метод, с помощью которого вы можете заказать свой запрос и просто получить первые десять записей.Это было бы более эффективно, чем у вас есть цикл.

Причина, по которой ваш шаблон не работает, заключается в том, что вы ссылаетесь на список, а не на отдельную запись.Это должно быть:

{% for entry in entries_list %}
        <i><b>Name:</i></b> {{ entry.name }}<br>
        <img src="/images{{ entry.picture }}" height="300" width="300"></img><br>
        <i><b>Ingredients:</i></b> {{ entry.ingredients }}<br>
        <p><i>{{ entry.description }}</i></p>
        <i><b>Created by:</i></b> {{ entry.user }}<br><br>
{% endfor %}

После того, как ваш шаблон заработал, попробуйте это, чтобы получить свой entry_list:

entries_list = Recipes.objects.order_by('-id')[0:10]

Вот документы по сортировке и нарезке запросов: https://docs.djangoproject.com/en/dev/topics/db/queries

1 голос
/ 05 сентября 2011

Итак, что вы сделали: Если вы знаете основы языка Си .. Ваша проблема состоит в том, чтобы напечатать элемент массива, так что вы будете идти как ..

array = [1,2,3,4,5,6,7]
int i=0;
for(i=0;i<8;i++) {
       print i;      // print array; is wrong
}

Аналогично в вышеупомянутом случае вы выполняете итерацию по entries_list и присваиваете каждый элемент переменной entries. Теперь вы будете играть с entries.

{% for entries in entries_list %}
        <i><b>Name:</i></b> {{ entries.name }}<br>
        <img src="/images{{ entries.picture }}" height="300" width="300"></img><br>
        <i><b>Ingredients:</i></b> {{ entries.ingredients }}<br>
        <p><i>{{ entries.description }}</i></p>
{% endfor %}

И конечно @CarL дал вам лучшее решение для получения последних 10 рецептов для ваших моделей.

...