在这个很棒的社区的第一篇文章,我已经读了很久了:)
我在使用这个神奇的库"django-tables2"时遇到了一个问题。当我按CharField对列排序时,它会区分大小写排序,导致如下的意外行为:
Iago
Pablo
iago
我想以更自然的方式排序:
Iago
iago
Pablo
这是我对表的简化代码:
class Inquiry(models.Model):
...
contact_last_name = models.CharField(max_length=50)
...
class Hometable(tables.Table):
contact_last_name = tables.Column(verbose_name="Contact", order_by=('contact_last_name'))
class Meta:
model = Inquiry
fields= ('contact_last_name',)
我知道在Django 1.8中有一个内置函数Lower来创建一个不敏感的order_by,但它不适用于Django表:
contact_last_name = tables.Column(verbose_name="Contact", order_by=(Lower('contact_last_name')))
会导致一个异常:
TypeError at /
'Lower' object is not iterable
有人对django-tables2做过类似的事情吗?
谢谢!
UPDATE:解决方案是在视图中使用小写字段做一个注释,然后可以在表中排序。
class Inquiry(models.Model):
...
contact_last_name = models.CharField(max_length=50)
...
class Hometable(tables.Table):
contact_last_name = tables.Column(verbose_name="Contact", order_by=('contact_last_name_lower'))
class Meta:
model = Inquiry
fields= ('contact_last_name',)
并在将表配置为Alasdair目的时在查询集中进行适当的注释:
inquiries = inquiries.annotate(contact_last_name_lower=Lower('last_name'))
my_table = Hometable(inquiries)
基于https://django-tables2.readthedocs.io/en/latest/pages/ordering.html#table-order-foo-methods,你需要添加一个table.order_FOO() method
,最终像这样:
class Hometable(tables.Table):
contact_last_name = tables.Column(verbose_name="Contact", order_by=('contact_last_name'))
def order_contact_last_name (self, QuerySet, is_descending):
QuerySet = QuerySet.annotate(
field_lower=Func(F('contact_last_name '), function='LOWER')
).order_by(('-' if is_descending else '') + 'field_lower')
return (QuerySet, True)
class Meta:
model = Inquiry
fields= ('contact_last_name',)
当您单击列标题进行排序以及初始排序时,这应该可以工作。
我还没有尝试过,我不是很熟悉django-tables2,所以我不知道它是否会工作。
您可以尝试使用一个新的字段名,例如contact_last_name_lower
设置order_by
为列。
class Hometable(tables.Table):
contact_last_name = tables.Column(verbose_name="Contact", order_by=('contact_last_name_lower',))
class Meta:
model = Inquiry
fields= ('contact_last_name',)
然后,在实例化表时,用小写字段注释查询集。
queryset = Inquiry.objects.annotate(contact_last_name_lower=Lower('contact_last_name'))
table = Hometable(queryset)