django-table2 multi-column 排序 UI

django-table2 multi-column sorting UI

我正在尝试在 django-tables2 中进行 multi-column 排序。

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

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

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

目前看来这不是 django-tables2 的选项,尽管它被标记为 issue on the git page。我也希望将此视为此软件包的选项。

在 table.html 模板中简要查看源代码,列 header 的 href 由以下代码生成:{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}。再深入一点,似乎有一个 OrderByTuple object,它似乎想要执行此功能,但从未传递给渲染。我还没有深入了解为什么这个 OrderByTuple 没有传递给 href,但可能与从上面引用的模板调用的 OrderBy 链接到列而不是table。抱歉,我无法真正想出解决方案,但希望这能有所帮助。

好的,我已经找到了一个可行的解决方案,但还不是很完美,所以如果有人想提出更好的建议,我洗耳恭听!

首先,我创建了一个新的模板标签(有关放置自定义模板标签的位置的详细信息,请参阅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 header,替换 table.thead 块有:

    {% block table.thead %}
        {% render_header %}
    {% endblock table.thead %}

这应该可以解决问题!单击多个列 headers 将按照单击的顺序对它们进行排序,单击同一列两次将清除之前的选择(并反转顺序)。它并不完美。也许我稍后会对其进行改进,但它适用于我的直接用例。

也许我会联系 django_tables2 项目,看看他们是否有兴趣将我的自定义模板标签包含到主项目中:)

编辑:我应该注意,这需要 'django.core.context_processors.request' 或您设置中的上下文处理器中的等效项。

编辑:修复了 table.html 以更正代码。此外,请参阅 https://github.com/bradleyayers/django-tables2/issues/223 以跟踪此问题。