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

2024-09-30 06:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在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'

谢谢!在


Tags: nameselfgetreturnobjectsrequestcontextblog
2条回答

ListView类也有一个get_context_data方法,因此应该重写该方法,而不是get方法。使用^{}可以访问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

相关问题 更多 >

    热门问题