Я хочу иметь отсортированные столбцы в своих таблицах (точно так же, как это делается для администраторов списков изменений).... Я ищу решение, которое будет легко реализовать и настроить, если я захочу.
Как я могу это сделать?
Я хочу иметь отсортированные столбцы в своих таблицах (точно так же, как это делается для администраторов списков изменений).... Я ищу решение, которое будет легко реализовать и настроить, если я захочу.
Как я могу это сделать?
Javascript? Там есть множество сортировщиков таблиц:
Если вы используете разбивку на страницы, а не сортировщик таблицы Javascript, это может быть недостаточно или привести к непредвиденным результатам.
Создайте каждый заголовок столбца в качестве ссылки, например.
<th><a href="?order_by=name">Name</a></th>
и, на ваш взгляд, вы устанавливаете, установлен ли параметр order_by
или нет:
order_by = request.GET.get('order_by', 'defaultOrderField')
Model.objects.all().order_by(order_by)
Я предлагаю вам взглянуть на django-tables2. Он предназначен для решения вашей конкретной проблемы. Документация содержит несколько примеров.
Я использовал подход, за которым следовал самый проголосовавший ответ выше. Но я решаю восходящее/нисходящее упорядочение, когда вы нажимаете несколько раз на заголовок столбца с помощью настраиваемого тега.
Тег:
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 в шаблон.
продолжая самый проголосовавший ответ выше, Феликс Клинг и добавление mpaf и ngeek при использовании представлений на основе классов: выполните сортировку в методе get_queryset (self) и используйте:
<th><a href="?{% url_replace view.request 'order_by' 'name' '-' %}">Name</a></th>
вместо простого запроса в вашем шаблоне