2016-03-31 37 views
0

我一直很难让ListView在我正在处理的博客项目上按预期呈现。在ListView中使用get_queryset()方法,Django 1.9

我有一个标签模式,这是一个Post模型的一部分,具体如下(从models.py我Post模型):

class Post(models.Model): 
    (...) 
     tags = models.ManyToManyField(Tag) 

TagListView在views.py如下:

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的如下(包含在该项目等等,虽然 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>的URL调用了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的方法造成的。

谢谢。

+0

这里有一些调试缺失。你确定这个观点实际上被称为?你有没有确保slug的论点是正确的?代码进入'get_queryset'吗?您是否检查过该方法返回的内容?你可以使用调试器完成所有这些工作,或者只需通过打印语句就可以完成相关工作。 –

+0

除了别的,这是一个帖子列表,而不是标签列表,所以模型应该是Post。但这不会影响任何东西。 –

+0

'object_list'实际包含什么?没有?还有别的吗? – YPCrumble

回答

2

这里有很多问题需要解压缩。一对夫妇的答案:

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

+0

谢谢。该链接解释了文档丢失的内容。 看起来好像添加了'template_name =“tag_post_list.html”'得到了我正在寻找的结果,这对我来说实际上没什么意义,现在我想到了它。 现在解决staticfiles问题。 –