Подтвердить что ты не робот

Сортируемые столбцы таблицы в django

Я хочу иметь отсортированные столбцы в своих таблицах (точно так же, как это делается для администраторов списков изменений).... Я ищу решение, которое будет легко реализовать и настроить, если я захочу.

Как я могу это сделать?

4b9b3361

Ответ 2

Если вы используете разбивку на страницы, а не сортировщик таблицы 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)

Ответ 4

Я использовал подход, за которым следовал самый проголосовавший ответ выше. Но я решаю восходящее/нисходящее упорядочение, когда вы нажимаете несколько раз на заголовок столбца с помощью настраиваемого тега.

Тег:

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 в шаблон.

Ответ 5

продолжая самый проголосовавший ответ выше, Феликс Клинг и добавление mpaf и ngeek при использовании представлений на основе классов: выполните сортировку в методе get_queryset (self) и используйте:

<th><a href="?{% url_replace view.request 'order_by' 'name' '-' %}">Name</a></th>

вместо простого запроса в вашем шаблоне