2015-09-16 80 views
1

第一篇文章在這真棒社區,我一直在閱讀前很長一段時間:)訂貨情況的Django tables2敏感

我已經使用這個夢幻般的圖書館「的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有一個內置的功能下做出不敏感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',) 

和配置旨意表作爲阿拉斯代爾時作出適當的註釋在查詢集:

inquiries = inquiries.annotate(contact_last_name_lower=Lower('last_name')) 
my_table = Hometable(inquiries) 
+3

「不可迭代」錯誤是因爲您錯過了'(Lower('contact_last_name'),'')中的逗號。解決該問題後可能無法工作,但錯誤信息會有所不同。 – Alasdair

+0

如果現有答案不完整,最好給自己的問題添加一個答案,而不是在問題本身中包含答案。 – Alasdair

回答

0

我沒有嘗試過這一點,我不是很熟悉的Django tables2所以我不知道它是否會起作用。

您可以嘗試使用新的字段名稱,例如當爲列設置order_by時,爲contact_last_name_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 = Inquiry.objects.annotate(contact_last_name_lower=Lower('contact_last_name')) 
table = Hometable(queryset) 
+0

謝謝!它現在有效!在發佈之前,我嘗試了這個解決方案,但在代碼中輸入錯誤,並且不起作用。我要更新帖子以保持清晰的解決方案。 –