django中的可排序表列

Ste*_*en 22 django

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

我怎样才能做到这一点?

Fel*_*ing 40

如果您使用分页而不是Javascript表分类器,则可能不够或行为意外.


创建每个列标题作为链接,例如

<th><a href="?order_by=name">Name</a></th>
Run Code Online (Sandbox Code Playgroud)

并在您的视图中检查order_by参数是否设置:

order_by = request.GET.get('order_by', 'defaultOrderField')
Model.objects.all().order_by(order_by)
Run Code Online (Sandbox Code Playgroud)

  • 这很优雅,但如何解决上升/下降问题? (2认同)

bra*_*ers 9

我建议你看看django-tables2.它旨在解决您的确切问题.该文件有一堆的例子.


mpa*_*paf 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())))
Run Code Online (Sandbox Code Playgroud)

然后在列标题上使用此标记,如上所示:

<th><a href="?{% url_replace request 'order_by' 'name' '-' %}">Name</a></th>
Run Code Online (Sandbox Code Playgroud)

第一次单击它将按"降序"排序,如果再次单击相同的标题,它将恢复为"升序"顺序.

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