【问题标题】:Django overriding detail view get methodDjango覆盖详细视图获取方法
【发布时间】: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_queryset 和 get_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_queryset 和 get_context_data 以自动调用?

【问题讨论】:

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

标签: django detailview getmethod


【解决方案1】:

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

对于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 的来源并观察到方法是从那里调用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2020-10-30
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多