Django 重写详细视图 get 方法

asd*_*fjk 5 django getmethod detailview

这是我的帖子详细视图,效果非常好。

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
Run Code Online (Sandbox Code Playgroud)

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

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

添加 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'
Run Code Online (Sandbox Code Playgroud)

那么我应该把这段代码放在哪里,并且仍然想继续调用所有方法,例如get_querysetget_context_data自动调用?

Wil*_*sem 6

DetailView像 a 、等视图的想法ListView是它为您实现样板逻辑。所以它定义了一个函数def get(self, request, *args, **kwargs),用来渲染逻辑。model您通常可以通过指定、等来调整一些内容queryset,而无需重新实现整个视图。

对于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)
Run Code Online (Sandbox Code Playgroud)


Sai*_*zad 2

我想分享的一条一般性建议是:在重写任何属性之前,必须深入了解该属性的意义(可调用或不可调用)。此建议适用于任何语言或框架。假设当有人重写 getDjango 中的 时,所有正在调用的方法都get不会被调用,除非有人从重写的方法中调用该方法get。因此,您应该查看其来源get并观察从中调用的方法。