这是我的帖子详细信息视图,可以很好地工作。
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
?
答案 0 :(得分:0)
我想分享的一个一般建议:
在覆盖任何属性之前,必须深刻了解该属性的重要性(可调用或不可调用)。该建议适用于任何语言或框架。假设当某人在Django中覆盖get
时,从get
调用的所有方法都不会被调用,除非有人调用了被覆盖的get
形式。因此,您应该查看get
的来源,并注意方法被称为that。
答案 1 :(得分:0)
诸如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)