如何在override get方法Django中返回常规响应

时间:2015-12-24 08:05:44

标签: python django django-class-based-views

我尝试在Django中使用基于类的视图。我有这样的问题:我为博客(BlogBaseView)和另外两个继承它的类定义了一个基类。 在第二个类(BlogIndexView)中,我想通过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'

谢谢!

2 个答案:

答案 0 :(得分:2)

ListView类也有get_context_data方法,因此您应该覆盖它而不是get方法。使用super您可以访问BlogBaseView.get_context_data,然后您可以扩展结果。

以下是:

class BlogIndexView(BlogBaseView, ListView):
    queryset = Post.objects.all().order_by('-date_create')
    template_name = 'index_blog.html'
    context_object_name  = 'posts'

    def get_context_data(self, **kwargs):
        # use the (super) force Luke
        context = super(BlogIndexView, self).get_context_data(**kwargs)
        if self.request.GET.get('tag'):
            context['posts'] = Post.objects.filter(tags__name__in=[self.request.GET.get('tag')])
        return context

答案 1 :(得分:1)

如果您要覆盖ListView,那么覆盖get方法不是一个好主意,因为您将失去很多ListView功能。

在这种情况下,最好覆盖get_queryset并在那里进行搜索。

def get_queryset(self):
    queryset = super(BlogIndexView, self). get_queryset() 
    if request.GET.get('tag'):
        queryset = queryset.filter(tags__name=request.GET['tag'])
    return queryset