Django覆盖详细视图获取方法

Posted

技术标签:

【中文标题】Django覆盖详细视图获取方法【英文标题】:Django overriding detail view get method 【发布时间】:2019-12-29 22:30:41 【问题描述】:

这是我的帖子详情视图,效果很好。

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

【问题讨论】:

你还没有解释你想做什么。为什么要覆盖 get 方法?你用那个方法做什么? 这很有意义,因为get(..) 已经实现触发get_context_data 等并使用该上下文呈现模板,因此通过覆盖它,您可以删除样板逻辑。 【参考方案1】:

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)

【讨论】:

请看我的编辑。我在互联网上找到大多数解决方案,其中 get 方法被覆盖。但这对我不起作用。 @asdfkjasdfjk:但这通常用于基于函数的视图。【参考方案2】:

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

【讨论】:

以上是关于Django覆盖详细视图获取方法的主要内容,如果未能解决你的问题,请参考以下文章

基于 Django 类的视图和通用视图详细信息使用

Django框架详细介绍

django 管理界面 - 如何在更改列表视图中折叠/展开对象详细信息?

为啥我不能使用类别详细视图?如果在django中使用它得到404?

Django slug 更改 URL 但没有获得详细视图

Django - 详细视图 URL 中的模型 ID,第一个 ID 不起作用