对象列表始终为空
这个应用程序的工作方式是这样的。我有一个简单的新闻添加模型,如下所示:
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 个回答
当你想要遍历一些东西,比如这样:
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 %}
当你使用 get 的时候,变量 posts 里会有一个 实例,这个实例是 News 的一个对象。相反,如果你使用 .all(),那么 posts 里会包含一个 查询集。所以我建议你先用 filter,而不是 get,这样 posts 始终会是一个查询集,这样就不会出现这种不一致的情况了……
请把你正在运行的代码贴出来。因为你提到的两个方法都无法使用 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 %}
。