Django覆盖细节视图get方法

r9f1avp5  于 2022-12-30  发布在  Go
关注(0)|答案(2)|浏览(149)

这是我的post细节视图,它工作得很完美。

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方法应该是什么,它的工作原理和以前完全一样?

EDIT我的目标是做类似这样的事情

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,以便自动调用呢?

e0bqpujr

e0bqpujr1#

DetailViewListView等视图的想法是它为你实现了 * 样板逻辑 。所以它定义了一个函数def get(self, request, *args, **kwargs)来呈现逻辑。你通常可以通过指定modelqueryset等来调整一些东西,而不需要重新实现整个视图。
对于一个
*DetailView**[Django-doc],逻辑是在BaseDetailView中实现的,你可以检查源代码[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)
wgmfuz8q

wgmfuz8q2#

我想和大家分享一条一般性的建议:在覆盖任何属性之前,必须深入了解该属性的重要性(可调用或不可调用)。这个建议适用于任何语言或框架。假设有人在Django中重写了get,从get调用的所有方法将不被调用,除非从被覆盖的get调用该方法。因此,您应该看到get的源代码,并观察方法是从那里调用的。

相关问题