2010-02-16 5 views
20

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

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

ответ

13
+1

tablesorter - отличный и поддерживаемый инструментарий. Ссылка выше старая - обязательно посмотрите на https://github.com/Mottie/tablesorter – staggart

38

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

Я думаю, что «;» в конце строки кода 'order_by' не требуется. Я не могу отредактировать его, потому что для редактирования должно быть не менее 6 символов. –

+1

@ la_f0ka: Спасибо ...Я всегда переключался между JavaScript и Python;) –

+0

np, спасибо, ... Я не знал, как это сделать, и я собирался установить еще одно приложение для его обработки, когда это на самом деле так просто. –

8

Я предлагаю вам взглянуть на django-tables2. Он предназначен для решения вашей конкретной проблемы. У documentation есть куча примеров.

+1

Похоже, что Брэдли перевел свою [вилку] (https: // github .com/bradleyayers/django-tables2) и [docs] (http://django-tables2.readthedocs.org/). – davidfischer

+0

Спасибо, Дэвид, я отредактировал большинство сообщений, которые я мог найти, чтобы обратиться к новому имени, но, я думаю, я пропустил это :( –

5

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

Тег:

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

1

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

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

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

Смежные вопросы