Django-1.5的官方文档中关于分页与类视图混合有点小错误,不过官方文档已经改过来了~~~
在该分页中,混合了SingleObjectMixin和ListView, 该view的目的是,通过url传递进来的pk参数来获取确切的Publisher记录,并且使用分页,来显示该Publisher记录下的所有book记录。
其中,get方法的作用是调用SingleObjectMixin的get_object来获取当前传入的pk值所对应的Publisher记录,存储在self.object变量中。而get_queryset方法根据self.object,检索返回对应的book记录。
但是,在整个过程中,文档中的写法忽略了,get_object方法是根据get_queryset方法返回的queryset来filter该queryset的PK值,才得到对应的Publisher记录。而在这里,很明显,
get_object()需要调用get_queryset(),而get_queryset()又希望根据get_object()所返回的object来获取book记录。显然是不对的。
如下图:
解决方法就是,在get方法中,调用get_object的时候,传入一个queryset参数,在get_object的源码中,如果你入参的时候,传入了queryset这个参数,则就根据该queryset来filter,而不是根据get_queryset方法返回的queryset来filter了。并且,我们调用get_object的时候,传入的queryset参数必须是父类的queryset,而不是我们覆盖的queryset,因为只有父类的get_queryset才去得到对应的Publisher记录的queryset。
如图:
在我们具体需要中,例如:我们需要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_object中传入正确的queryset就行,官方文档改过来的是
self.object = self.get_object(queryset=Publisher.objects.all())其实也是一样的