【发布时间】: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