我尝试在Django中使用基于类的视图。我遇到了这样的问题:我为blog(BlogBaseView
)定义了一个基类,以及其他两个继承它的类。
在第二个类(BlogIndexView
)中,我希望通过get请求进行搜索,因此我有了覆盖get
方法。它可以工作,但是如果我不发出get请求,它将返回HttpResponse,但是我希望返回通常的上下文(它BlogIndexView
在不重写get
方法的情况下返回)。在
我能做什么?在
class BlogBaseView(View):
def get_context_data(self, **kwargs):
context = super(BlogBaseView, self).get_context_data(**kwargs)
blog_categories = []
categories = BlogCategory.objects.all()
for category in categories:
blog_categories.append(tuple([category, category.get_number_of_category_items]))
context['name_page'] = 'blog'
context['tags'] = Tag.objects.all()
context['blog_categories'] = blog_categories
return context
class BlogIndexView(BlogBaseView, ListView):
queryset = Post.objects.all().order_by('-date_create')
template_name = 'index_blog.html'
context_object_name = 'posts'
def get(self, request):
if request.GET.get('tag'):
context = {
'posts' : Post.objects.filter(tags__name__in=[request.GET.get('tag')])
}
return render(request, self.template_name, context)
return HttpResponse('result')
class BlogFullPostView(BlogBaseView, DetailView):
model = Post
template_name = 'full_post.html'
pk_url_kwarg = 'post_id'
context_object_name = 'post'
谢谢!在
ListView
类也有一个get_context_data
方法,因此应该重写该方法,而不是get
方法。使用^{BlogBaseView.get_context_data
,然后可以扩展结果。在方法如下:
如果您要重写
ListView
,那么重写get
方法不是一个好主意,因为您将丢失很多ListView
功能。在在这种情况下,最好重写
get_queryset
,然后在那里进行搜索。在相关问题 更多 >
编程相关推荐