在django-tables中不区分大小写



在这个很棒的社区的第一篇文章,我已经读了很久了:)

我在使用这个神奇的库"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)

相关内容

  • 没有找到相关文章

最新更新