django-table2多列排序UI

时间:2015-08-05 16:55:50

标签: python django django-tables2

我正在尝试在django-tables2中进行多列排序。

我可以添加?sort=date&sort=job_number 到我的网址的末尾,它将按日期排序,然后按作业编号排序。

但是当用户单击列标题时,它将用新的查询字符串替换当前的排序查询字符串!有没有办法更优雅地向最终用户公开多列排序?

我正在使用' querystring'来自django-tables2的标记,但如上所述,它重写值而不是附加它。

2 个答案:

答案 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链接到列的事实有关。不是桌子。对不起,我无法提出解决方案,但希望这会有所帮助。