Я использовал подход, за которым следует наиболее проголосовавший ответ выше. Но я решаю восходящий/нисходящий порядок, когда вы нажимаете несколько раз на заголовок столбца, используя специальный тег.
Тег:
from urllib.parse import urlencode
from collections import OrderedDict
@register.simple_tag
def url_replace(request, field, value, direction=''):
dict_ = request.GET.copy()
if field == 'order_by' and field in dict_.keys():
if dict_[field].startswith('-') and dict_[field].lstrip('-') == value:
dict_[field] = value
elif dict_[field].lstrip('-') == value:
dict_[field] = "-" + value
else:
dict_[field] = direction + value
else:
dict_[field] = direction + value
return urlencode(OrderedDict(sorted(dict_.items())))
Затем вы используете этот тег на вашем заголовке столбца, как выше:
<th><a href="?{% url_replace request 'order_by' 'name' '-' %}">Name</a></th>
Первый раз, когда вы щелкните по ней разберется в «убывающего заказ, если вы нажмете тот же заголовок снова вернется к «восходящему» порядку.
Этот подход также сохраняет другие параметры в вашем URL-адресе, например номер страницы, если вы используете paginator. Он не требует дополнительных библиотек. Единственное, что вам нужно убедиться, это то, что ваше представление отправляет RequestContext в шаблон.
tablesorter - отличный и поддерживаемый инструментарий. Ссылка выше старая - обязательно посмотрите на https://github.com/Mottie/tablesorter – staggart