这是我的帖子详细信息 View ,效果很好。
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
但是,当我向 View 添加 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
被自动调用?
最佳答案
意见的想法像DetailView
, ListView
等是它为您实现样板逻辑。所以它定义了一个函数def get(self, request, *args, **kwargs)
用于呈现逻辑。您通常可以通过指定 model
来调整一些内容。 , queryset
等,而无需重新实现整个 View 。
对于 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)
关于Django 覆盖详细信息 View 获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645928/