asd*_*fjk 5 django getmethod detailview
这是我的帖子详细视图,效果非常好。
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
Run Code Online (Sandbox Code Playgroud)
但是,当我将 get 方法添加到视图时,它不再起作用。
def get(self, request, *args, **kwargs):
# how to return here so that it works exactly like before
Run Code Online (Sandbox Code Playgroud)
添加 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'
Run Code Online (Sandbox Code Playgroud)
那么我应该把这段代码放在哪里,并且仍然想继续调用所有方法,例如get_queryset
和get_context_data
自动调用?
DetailView
像 a 、等视图的想法ListView
是它为您实现样板逻辑。所以它定义了一个函数def get(self, request, *args, **kwargs)
,用来渲染逻辑。model
您通常可以通过指定、等来调整一些内容queryset
,而无需重新实现整个视图。
对于DetailView
[Django-doc],逻辑是在BaseDetailView
您可以检查源代码 [GitHub]中实现的:
Run Code Online (Sandbox Code Playgroud)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
Django 中的 时,所有正在调用的方法都get
不会被调用,除非有人从重写的方法中调用该方法get
。因此,您应该查看其来源get
并观察从中调用的方法。
归档时间: |
|
查看次数: |
3821 次 |
最近记录: |