在ListView中使用get_queryset()方法,Django 1.9

时间:2016-03-31 17:31:12

标签: python html django listview model-view-controller

我一直难以让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()方法。

感谢。

1 个答案:

答案 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从未被调用,因为模板没有被调用...