Django覆盖详细视图的get方法

时间:2019-08-25 12:16:21

标签: django detailview getmethod

这是我的帖子详细信息视图,可以很好地工作。

class PostDetailView(DetailView):
    model = Post
    context_object_name = 'post'
    template_name = 'posts/detail.html'

    def get_queryset(self, *args, **kwargs):
        request = self.request
        pk = self.kwargs.get('pk')
        queryset = Post.objects.filter(pk=pk)
        return queryset

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        content['comments'] = Comment.objects.all()

        return context

但是,当我将get方法添加到视图时,它不再起作用。

def get(self, request, *args, **kwargs):
    # how to return here so that it works exactly like before

添加get方法get_querysetget_context_data后不会自动被调用,并且模板中的上下文为空。那么什么叫get方法,使其完全像以前一样工作?

编辑 我的目标是要做这样的事情

if request.is_ajax():
    html = render_to_string('comments/detail.html')  # ajax reply with html data
    return HttpResponse(html)
 return render 'posts/detail.html'

所以我将这段代码放在哪里,并且仍然希望继续调用所有要自动调用的方法,例如get_querysetget_context_data

2 个答案:

答案 0 :(得分:0)

我想分享的一个一般建议: 在覆盖任何属性之前,必须深刻了解该属性的重要性(可调用或不可调用)。该建议适用于任何语言或框架。假设当某人在Django中覆盖get时,从get调用的所有方法都不会被调用,除非有人调用了被覆盖的get形式。因此,您应该查看get的来源,并注意方法被称为that。

答案 1 :(得分:0)

诸如DetailViewListView等视图的想法是,它为您实现了样板逻辑。因此,它定义了一个函数def get(self, request, *args, **kwargs),该函数用于呈现逻辑。通常,您可以通过指定modelqueryset等来调整一些内容,而无需重新实现整个视图。

对于DetailView [Django-doc],该逻辑在BaseDetailView中实现,您可以检查source code [GitHub]

class BaseDetailView(SingleObjectMixin, View):
    """A base view for displaying a single object."""
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)