Python django-tables2中的排序不区分大小写
我很久以前在这个很棒的社区里读到的第一篇帖子:) 我在使用这个奇妙的库“django-tables2”时遇到了一个问题。当我按CharField对列进行排序时,它会进行区分大小写的排序,从而产生如下意外行为:Python django-tables2中的排序不区分大小写,python,django,accessor,django-tables2,Python,Django,Accessor,Django Tables2,我很久以前在这个很棒的社区里读到的第一篇帖子:) 我在使用这个奇妙的库“django-tables2”时遇到了一个问题。当我按CharField对列进行排序时,它会进行区分大小写的排序,从而产生如下意外行为: Iago Pablo iago class Hometable(tables.Table): contact_last_name = tables.Column(verbose_name="Contact", order_by=('contact_last_name'))
Iago
Pablo
iago
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',)
我希望以更自然的方式订购:
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做过类似的事情吗
谢谢大家!
更新:解决方案是在视图中创建一个带有小写字段的注释,然后可以在表中使用order by
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的目的配置表时在queryset中进行适当的注释:
inquiries = inquiries.annotate(contact_last_name_lower=Lower('last_name'))
my_table = Hometable(inquiries)
我还没有尝试过这个方法,而且我对django-tables2也不是很熟悉,所以我不知道它是否有效 在为列设置
order\u by
时,您可以尝试使用新字段名,例如contact\u last\u name\u lower
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
queryset = Inquiry.objects.annotate(contact_last_name_lower=Lower('contact_last_name'))
table = Hometable(queryset)
根据需要,您需要添加一个table.order\u FOO()方法
,并以如下方式结束:
Iago
Pablo
iago
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',)
当您单击要排序的列标题以及初始排序时,此操作应该会起作用。出现“不可编辑”错误是因为您在
中漏掉了一个逗号(下('contact_last_name'))
。在您修复该问题后,它可能不会工作一次,但错误消息将不同。如果现有答案不完整,最好为您自己的问题添加答案,而不是将答案包含在问题本身中。谢谢!现在可以了!我在发布之前尝试过这个解决方案,但是在代码中输入了一个错误,结果没有成功。我将更新帖子以明确解决方案。