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 以跟踪此问题。
我正在尝试在 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 以跟踪此问题。