我正在尝试在django-tables2中进行多列排序。
我可以添加?sort=date&sort=job_number
到我的网址的末尾,它将按日期排序,然后按作业编号排序。
但是当用户单击列标题时,它将用新的查询字符串替换当前的排序查询字符串!有没有办法更优雅地向最终用户公开多列排序?
我正在使用' querystring'来自django-tables2的标记,但如上所述,它重写值而不是附加它。
答案 0 :(得分:1)
好的,我已经找到了一个有效的解决方案,但它并不完美,所以如果有人想提出更好的建议,我会全力以赴!
首先,我创建了一个新的模板标签(有关自定义模板标签放置位置的详细信息,请参阅https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/)
from django import template
from django_tables2.templatetags.django_tables2 import querystring
register = template.Library()
@register.inclusion_tag('django_tables2/header.html', takes_context=True)
def render_header(context):
for column in context['table'].columns:
column.sort_existing = False
if 'sort' in context['request'].GET:
if column.name in context['request'].GET['sort']:
column.sort_existing = True
return context
然后,我为该标记创建了一个名为django_tables2 / header.html的自定义模板:
{% load querystring from django_tables2 %}
<thead>
<tr>
{% for column in table.columns %}
{% if column.orderable %}
{% if column.sort_existing %}
<th {{ column.attrs.th.as_html }}><a href='{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}'>{{ column.header }}</a></th>
{% else %}
<th {{ column.attrs.th.as_html }}><a href='{% querystring %}&{{ table.prefixed_order_by_field }}={{ column.order_by_alias }}'>{{ column.header }}</a></th>
{% endif %}
{% else %}
<th {{ column.attrs.th.as_html }}>{{ column.header }}</th>
{% endif %}
{% endfor %}
</tr>
</thead>
最后,我修改了我的django_tables2 / table.html模板,使用我的自定义模板标签来呈现表头,将table.thead块替换为:
{% block table.thead %}
{% render_header %}
{% endblock table.thead %}
这应该可以解决问题!单击多个列标题将按照单击的顺序对它们进行排序,单击相同的两个列将清除先前的选择(并反转顺序)。它并不完美。也许我稍后会改进它,但它适用于我的直接用例。
也许我会联系django_tables2项目,看看他们是否有兴趣将我的自定义模板标签包含在主项目中:)
编辑:我应该注意,这需要在您的设置中的上下文处理器中使用'django.core.context_processors.request'或等效文件。
编辑:修正table.html以更正代码。另请参阅https://github.com/bradleyayers/django-tables2/issues/223以跟踪此问题。
答案 1 :(得分:0)
目前看来这不是django-tables2的一个选项,尽管它被标注为issue on the git page。我也希望将此视为此包的选项。
在table.html模板中简要查看源代码,列标题的href
由以下代码生成:{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}
。深入挖掘似乎有一个OrderByTuple
对象,似乎想要执行此功能,但永远不会传递给渲染。我没有足够深入地弄清楚为什么这个OrderByTuple
没有传递给href,但可能与从上面引用的模板调用的OrderBy链接到列的事实有关。不是桌子。对不起,我无法提出解决方案,但希望这会有所帮助。