视图blog.views.BlogViews没有返回HttpResponse对象。它返回None

时间:2019-09-24 15:16:04

标签: python django

我的博客主页视图有问题。我已经读过很多相同错误的问题,但是找不到我认为与我的问题相符的解决方案。

我正在尝试使用新的View模仿旧代码,以便将来可以对其进行进一步的自定义。

  path('', ListView.as_view(
                    queryset=Post.objects.filter(posted_date__lte=now).order_by("-posted_date")[:25],
                    template_name="blog/blog.html")),

我以前只是使用上述url模式显示我的博客文章,但我转到了一个视图:

def BlogViews(TemplateView):
  def get(self, request):
    posts = Post.objects.all().order_by("-posted_date")[:25]
    args = {
      'posts' : posts,
    }
    return render(request, 'blog/blog.html', args)

和新网址

path('', BlogViews, name='blog'),

但是,该视图不起作用,并在标题中返回错误。 我相信我正在导入TemplateView,并正确发布和呈现。

1 个答案:

答案 0 :(得分:1)

TemplateView是基于类的视图,因此您可以使用class对其进行子类化。

class BlogViews(TemplateView):
    def get(self, request):
        posts = Post.objects.all().order_by("-posted_date")[:25]
        args = {
            'posts' : posts,
        }
        return render(request, 'blog/blog.html', args)

然后在网址格式中使用.as_view()

path('', BlogViews.as_view(), name='blog'),

避免为基于类的视图覆盖getpost。您最终会失去父类的功能或将其复制。您可以将ListView.as_view(...)作为视图的起点,例如:

class BlogView(ListView):
    template_name="blog/blog.html"

    def get_queryset(self):
        # Use get_queryset instead of queryset because you want timezone.now()
        # to be called when the view runs, not when the server starts 
        return Post.objects.filter(posted_date__lte=timezone.now()).order_by("-posted_date")[:25]

对于您而言,使用基于函数的视图可能会更容易:

def blog_view(request):
    posts = Post.objects.all().order_by("-posted_date")[:25]
    args = {
        'posts' : posts,
    }
    return render(request, 'blog/blog.html', args)

然后将其包含在URL中:

path('', blog_view, name='blog'),