Django1.5的分页中,官方文档的一个小错误

Django-1.5的官方文档中关于分页与类视图混合有点小错误,不过官方文档已经改过来了~~~

在该分页中,混合了SingleObjectMixinListView, 该view的目的是,通过url传递进来的pk参数来获取确切的Publisher记录,并且使用分页,来显示该Publisher记录下的所有book记录。

其中,get方法的作用是调用SingleObjectMixinget_object来获取当前传入的pk值所对应的Publisher记录,存储在self.object变量中。而get_queryset方法根据self.object,检索返回对应的book记录。

但是,在整个过程中,文档中的写法忽略了,get_object方法是根据get_queryset方法返回的querysetfilterquerysetPK值,才得到对应的Publisher记录。而在这里,很明显,

get_object()需要调用get_queryset(),get_queryset()又希望根据get_object()所返回的object来获取book记录。显然是不对的。

如下图:

Django1.5的分页中,官方文档的一个小错误_第1张图片


解决方法就是,在get方法中,调用get_object的时候,传入一个queryset参数,在get_object的源码中,如果你入参的时候,传入了queryset这个参数,则就根据该querysetfilter,而不是根据get_queryset方法返回的querysetfilter了。并且,我们调用get_object的时候,传入的queryset参数必须是父类的queryset,而不是我们覆盖的queryset,因为只有父类的get_queryset才去得到对应的Publisher记录的queryset

如图:

Django1.5的分页中,官方文档的一个小错误_第2张图片


在我们具体需要中,例如:我们需要ID为x的Poke记录下的所有的card进行分页,url有/poke/x

解决方式:

 class PokeDetailView(SingleObjectMixin, ListView):
     paginate_by = 2
     model = Poke
     template_name = 'pokes.html'
     def get(self, request, *args, **kwargs):
         self.object = self.get_object(queryset = super(PokeDetailView, self).get_queryset())
         return super(PokeDetailView, self).get(request, *args, **kwargs)
 
     def get_context_data(self, **kwargs):
         context = super(PokeDetailView, self).get_context_data(**kwargs)
         context['poke'] = self.object
         return context
 
     def get_queryset(self):
         return self.object.card.filter(xx = None)


在get的方法中,self.get_object方法传入的queryset是调用父类的get_queryset,因为父类的get_queryset方法就是根据model属性来获取该model的queryset。然后,get_object会根据pk值获取对应的poke记录。


我们只需要在get_object中传入正确的queryset就行,官方文档改过来的是

self.object = self.get_object(queryset=Publisher.objects.all())
其实也是一样的




你可能感兴趣的:(django,python,分页)