我如何 return 覆盖 get 方法中的常规响应,Django

How can I return regular response in override get method, Django

我尝试在 Django 中使用基于 class 的视图。我有这样的问题:我为一个博客 (BlogBaseView) 和另外两个继承它的 classes 定义了一个基础 class。 在第二个 class(BlogIndexView) 中,我想通过 get 请求进行搜索,所以我重写了 get 方法。它有效,但如果我不发出获取请求,它会 returns HttpResponse,但是我想 return 通常的上下文(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 class 也有一个 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

如果您要重写 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