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