【问题标题】:Ordering case insensitive in django-tables2在 django-tables2 中排序不区分大小写
【发布时间】:2015-09-16 11:06:11
【问题描述】:

我很久以前就读过的这个很棒的社区的第一篇文章 :)

我在使用这个奇妙的库“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 做过类似的事情吗?

谢谢!

更新:解决方案是在视图中使用小写字段进行注释,然后可以在表中进行排序。

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)

【问题讨论】:

  • “不可迭代”错误是因为您在(Lower('contact_last_name'),) 中遗漏了一个逗号。修复后它可能无法正常工作,但错误消息会有所不同。
  • 如果现有答案不完整,最好为自己的问题添加答案,而不是将答案包含在问题本身中。

标签: python django accessor django-tables2


【解决方案1】:

基于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',)

当您单击列标题进行排序以及初始排序时,这应该可以工作。

【讨论】:

    【解决方案2】:

    这个我没试过,对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)
    

    【讨论】:

    • 谢谢!现在可以了!我在发布之前尝试了这个解决方案,但是在代码中打错了字,它没有用。我将更新帖子以明确解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2020-09-13
    • 2012-06-22
    • 1970-01-01
    • 2013-04-17
    • 2014-05-20
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多