2012-01-26 19 views
0

我有一個模型存儲通用外鍵不同的對象。我在某處顯示列表,並且由於空間限制,我想拼接對象名稱。無法應用切片Django對象的__unicode__屬性

所以我做了以下

{{list_object.content_object|slice:":20"}} 

但這不起作用。但是,當我做

{{list_object.content_object.title|slice:":20"}} 

切片的作品。但是我不能使用它,因爲content_objectgeneric foreign key並且每個對象都沒有名爲title的屬性。

請幫忙!

回答

2

當您直接在對象上切片時,Django從不會調用__unicode__,而是直接將該對象傳遞給過濾器。這是應該發生的實際行爲。當你在你的模板中做{{ some_object }}時,Django只會自動奇蹟地呼叫__unicode__,因爲它需要打印出

你最好的選擇將是一個方法添加到您的模型,以提供一個縮短的名稱,然後使用該方法在你的模板:

def MyModel(models.Model): 
    ... 
    def get_short_content_title(self): 
     return unicode(self.content_object)[:20] 

而且在你的模板:

{{ list_object.get_short_content_title }} 

或者從技術上說,您只需代理__unicode__電話,然後在模板中處理它即可:

def MyModel(models.Model): 
    def get_content_title(self): 
     return unicode(self.content_object) 

而且在你的模板:

{{ list_object.get_content_title|slice:":20" }} 

無論在方案中效果最好。

實際上多了一個替代方案是創建一個簡單的模板過濾器返回對象的Unicode值:

@register.filter 
def get_unicode(obj): 
    return unicode(obj) 

然後,在你的模板:

{{ list_object.content_object|get_unicode|slice:":20" }} 

你不愛選擇? ;)

+0

非常感謝這麼多的選擇!最後一個似乎是最通用的。這樣我就不必爲我的所有模型添加一個方法,我不知道Django自動傳遞該對象。 – Sachin

1

list_object.content_object是一個對象,由一個字符串表示。當然,你不能切分物體。爲了解決你的問題YOUT可以嘗試明確地調用的Unicode方法:

{{list_object.content_object.__unicode__|slice:":20"}} 

我還沒有試過,但它是我的第一個猜測。

+3

Django不允許您調用模板中的下劃線方法。但是,如果可以的話,那絕對是最好的方法;)。 –

+0

啊,好的。我知道django不允許用參數調用方法,但這對我來說是新的。謝謝,我不會使用它,除非我直到需要時纔將它忘記;) – marue