对象列表始终为空

1 投票
3 回答
1407 浏览
提问于 2025-04-16 01:48

这个应用程序的工作方式是这样的。我有一个简单的新闻添加模型,如下所示:

class News(models.Model):
    title = models.CharField(max_length=100)    
    publication_date = models.DateField(auto_now_add=True)
    content = models.TextField()

这是视图部分

def homepage(request):
  posts= News.objects.all() #.get(title="aaa")
  return render_to_response('homepage.html', {'a':posts})

最后是模板:

{% for b in a.object_list %}
   <li> title:{{ b.title }}</li>
{%empty %}
   EMPTY
{% endfor %}

不幸的是,它总是显示“空”。但是如果我用 '.get(title="aaa")' 代替 '.all()'(被注释的部分),我就能得到标题为“aaa”的消息的正确标题和内容。有人能解释我哪里做错了吗?谢谢你们的专业意见。

编辑:抱歉,我没有写出用于获取选项的模板。嗯,当然,'get' 版本的模板是不同的。它看起来像这样:

 {{a.title}} {{a.content} 

而且它可以正常工作,打印出预期的标题和消息内容。所以 'get' 在模板中有效,而 'for' 没有遍历通过 all() 返回的 QuerySet。我是个初学者,但 object_list 应该是传递给 render_on_request 的 QuerySet 的表示形式,对吧?

3 个回答

0

当你想要遍历一些东西,比如这样:

for object in object_list:
    print object

object_list 需要支持遍历。像列表(list)、元组(tuple)、字典(dict)和其他一些类型都支持遍历。你可以通过定义一个 iter 方法来创建你自己的迭代器类。想了解更多,可以查看 文档

现在,在你的例子中:

return render_to_response('homepage.html', {'a':posts})

posts 是一个支持遍历的 Queryset 实例。可以这样理解:

{% for b in News.objects.all %}

这就是你想要的结果,但你实际上做的是这样:

{% for b in News.objects.all.object_list %}

但是 News.objects.all 并没有 object_list 属性!

News.objects.all 应该就是你的 object_list,所以只需要写:

{% for b in a %}
0

当你使用 get 的时候,变量 posts 里会有一个 实例,这个实例是 News 的一个对象。相反,如果你使用 .all(),那么 posts 里会包含一个 查询集。所以我建议你先用 filter,而不是 get,这样 posts 始终会是一个查询集,这样就不会出现这种不一致的情况了……

0

请把你正在运行的代码贴出来。因为你提到的两个方法都无法使用 a.object_list,因为在任何地方都没有定义这个 object_list,而且它也不是 Django 内置的属性。

假设你真的想说的是在第一段代码中 for b in a 不起作用,但在第二段代码中可以工作,这也是不对的,因为使用 .get 的话,你没有任何东西可以用 for 来循环。

不过,假设你实际上是把 .all() 的结果传给了模板,而模板里没有 for 循环。这也不行,因为 all()filter() 一样,返回的是一个查询集(QuerySet),这个查询集必须要循环遍历。出于同样的原因,get() 也不能和 for 循环一起使用。

在评论后编辑 “object_list 应该是传递给 render_on_request 的查询集的表示” - 不是的,这个说法不对。你是从哪里得到这个想法的?如果你把一个叫 a 的查询集传给模板,那么你就直接循环遍历 a,而不是其他的。object_list 是在通用视图中默认使用的查询集名称,也就是你所称的 a,但在你自己的视图中,你可以随意命名,并用你给它的名字来使用。

在第二个评论后编辑 我不知道为什么这会让人困惑。你自己发明了一个需要 object_list 的情况,但实际上并没有这个变量,也没有必要。就按照我最开始说的做 - {% for b in a %}

撰写回答