一个简化的例子:
模板
<span>Currently ordering by {{ order_by }}</span>
<ul>
<li><a href="?order_by=price">price</a></li>
<li><a href="?order_by=pages">pages</a></li>
</ul>
<ul>
{% for obj in object_list %}
<li><a href="{{ obj.get_absolute_url }}">{{ obj.name }}</a></li>
{% endfor %}
</ul>
视图.py
class FooListView(ListView):
allow_ordering_on = ['pk', 'pages', 'price'] # restrictions
order_by = 'pk'
def get(self, request, *args, **kwargs):
order_by = request.GET.get('order_by', self.order_by)
if order_by in self.allow_ordering_on:
self.order_by = order_by
self.object_list = self.model.objects.all().order_by('whatever')
if not allow_empty and len(self.object_list) == 0:
raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
% {'class_name': self.__class__.__name__})
context = self.get_context_data(object_list=self.object_list)
return self.render_to_response(context)
else:
return super(FooListView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(FooListView, self).get_context_data(**kwargs)
context['order_by'] = self.order_by
return context
您可以覆盖get_context_data
以添加用于标记当前字段顺序的变量。