在Django模板中循环遍历对象列表

9 投票
2 回答
13601 浏览
提问于 2025-04-17 01:31

我好像找不到我哪里出错了。请原谅我,因为我还是个新手。我想要显示模型中最新的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 个回答

1

你做的事情是这样的:如果你了解C语言的基础知识……

你的问题是要打印数组中的元素,所以你可以这样做……

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个食谱。

8

有几点需要注意。你可以用一种方法来排序你的查询,然后只获取前十个结果。这样比你现在的循环要高效得多。

你的模板之所以不工作,是因为你在引用列表,而不是单个条目。应该改成这样:

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

一旦你的模板能正常工作,试试这个来获取你的entries_list:

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

这里有关于排序和切片查询的文档: https://docs.djangoproject.com/en/dev/topics/db/queries

撰写回答