django中的可排序表列

时间:2010-02-16 11:12:23

标签: django

我希望在我的表中有可排序的列(就像为管理员更改列表所做的那样)....我正在寻找一个易于实现和自定义的解决方案。

我该怎么做?

5 个答案:

答案 0 :(得分:39)

如果您使用分页而不是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)

答案 1 :(得分:14)

答案 2 :(得分:9)

我建议您查看django-tables2。它旨在解决您的确切问题。 documentation有很多例子。

答案 3 :(得分: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>

首次点击它会排序&#39;降序&#39;订单,如果再次点击相同的标题,它将恢复为“升序”状态。顺序。

如果您使用的是分页符,此方法还会保留您网址中的其他参数,例如页码。它不需要额外的库。您需要确保的是您的视图正在将RequestContext发送到模板。

答案 4 :(得分:1)

继续使用Felix Kling上面最多投票的答案,以及mpaf和ngeek在使用基于类的视图时添加的答案: 在get_queryset(self)方法中进行排序,并使用:

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

而不仅仅是模板中的请求