Python django-tables2中的排序不区分大小写

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'))

我很久以前在这个很棒的社区里读到的第一篇帖子:)

我在使用这个奇妙的库“django-tables2”时遇到了一个问题。当我按CharField对列进行排序时,它会进行区分大小写的排序,从而产生如下意外行为:

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'))
。在您修复该问题后,它可能不会工作一次,但错误消息将不同。如果现有答案不完整,最好为您自己的问题添加答案,而不是将答案包含在问题本身中。谢谢!现在可以了!我在发布之前尝试过这个解决方案,但是在代码中输入了一个错误,结果没有成功。我将更新帖子以明确解决方案。