这是我的post细节视图,它工作得很完美。
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方法应该是什么,它的工作原理和以前完全一样?
EDIT我的目标是做类似这样的事情
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
,以便自动调用呢?
2条答案
按热度按时间e0bqpujr1#
像
DetailView
,ListView
等视图的想法是它为你实现了 * 样板逻辑 。所以它定义了一个函数def get(self, request, *args, **kwargs)
来呈现逻辑。你通常可以通过指定model
,queryset
等来调整一些东西,而不需要重新实现整个视图。对于一个*
DetailView
**[Django-doc],逻辑是在BaseDetailView
中实现的,你可以检查源代码[GitHub]:wgmfuz8q2#
我想和大家分享一条一般性的建议:在覆盖任何属性之前,必须深入了解该属性的重要性(可调用或不可调用)。这个建议适用于任何语言或框架。假设有人在Django中重写了
get
,从get
调用的所有方法将不被调用,除非从被覆盖的get
调用该方法。因此,您应该看到get
的源代码,并观察方法是从那里调用的。