我的博客主页视图有问题。我已经读过很多相同错误的问题,但是找不到我认为与我的问题相符的解决方案。
我正在尝试使用新的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,并正确发布和呈现。
答案 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'),
避免为基于类的视图覆盖get
或post
。您最终会失去父类的功能或将其复制。您可以将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'),