我希望在我的表中有可排序的列(就像为管理员更改列表所做的那样)....我正在寻找一个易于实现和自定义的解决方案。
我该怎么做?
答案 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)
的Javascript?那里有很多桌子分拣机:
答案 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>
而不仅仅是模板中的请求