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_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
等并使用该上下文呈现模板,因此通过覆盖它,您可以删除样板逻辑。
【参考方案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
的来源并观察到方法是从那里调用的。
【讨论】:
以上是关于Django覆盖详细视图获取方法的主要内容,如果未能解决你的问题,请参考以下文章
django 管理界面 - 如何在更改列表视图中折叠/展开对象详细信息?