我一直难以让ListViews在我正在处理的博客项目中按预期呈现。
我有一个Tag模型,它是Post模型的一部分,如下所示(来自models.py中的Post模型):
class Post(models.Model):
(...)
tags = models.ManyToManyField(Tag)
views.py
中的TagListView如下:
class TagListView(ListView):
def get_queryset(self):
slug = self.kwargs['slug']
try:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
except Tag.DoesNotExist:
return Post.objects.none()
网址如下(尽管如此,项目也包含在内
url(r'^blog/?', include('blog.urls')),
,如下:
url(r'^tag/(?P<slug>[a-zA-Z0-9-]+)?/?$', TagListView.as_view(
paginate_by=5,
model=Tag,
)),
根据我的理解,访问一个URL,对于此示例,应该在localhost:8000/blog/tag/<name-of-tag-here>
,调用views.py中的TagListView,然后使用get_queryset()
方法生成帖子的ListView具有相同slug的标签,然后查找模板(/blog/templates/blog
),在我查看的教程中称为tag_post_list.html
,但是 - 文档不清楚关于ListView如何找到要呈现的模板,我只是按照过时的教程。
我对哪些变量传递到html模板以及如何访问它们感到有点困惑。从结果中我明确了get_queryset()
实际上并不仅仅返回具有相同标记列表的帖子。 Furthermore, my css isn't rendering, either (which I've made a separate post for),尽管很明显我的base.html
文件中的其他标签和元素都是。
模板开始{% extends 'base.html' %}
(位于/blog/templates/
)并通过{% for post in object_list %}
访问帖子。 object_list
显然不包含我认为应该包含的内容,据我所知,这应该归因于我误用ListView的get_queryset()
方法。
感谢。
答案 0 :(得分:2)
这里要解开很多问题。一对夫妇回答:
您的ListView
有一个template_name
属性,您可以在其中指定要使用的模板,如下所示:
class TagListView(ListView):
template_name = "tag_post_list.html"
def get_queryset(self):
slug = self.kwargs['slug']
try:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
except Tag.DoesNotExist:
return Post.objects.none()
有关基于类的视图的可用属性的快速列表,请参阅this site。
第二个答案 - 你说的是:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
...在您的视图中实际上并没有返回正确的Post
个对象。从您的代码中不清楚为什么会出现这种情况。您的观点看起来是正确的,但丹尼尔罗斯曼指出它应该基于模型Post
,而不是Tag
。覆盖get_queryset
方法以返回Post
个对象,但这意味着这不是违规问题。修复第一个问题实际上可能修复了第二个问题,因为object_list
从未被调用,因为模板没有被调用...