2012-02-15 70 views
2

有沒有辦法來正確地重載Django的get_FIELD_display()函數?當我從內部調用函數時,結果是遞歸。但是我不能用super()來調用它,因爲它不是父類的方法,而是由元類創建的方法...重載get_FIELD_display()函數

目標是獲得可顯示版本的CHOICE字段的通用接口(由get_FIELD_display給出),但可以在某些特定情況下對其進行自定義。

例子:

# This does not work because it results in recursion 
def get_opposition_state_display(self): 
    """Overloading of default function.""" 
    value = self.get_opposition_state_display() 
    if self.opposition_state == 4: 
     return '%s %s' % (value, self.opposition_date.strftime('%d.%m.%Y')) 
    return value 

回答

4

更新

field = self._meta.get_field('opposition_state') 
value = self._get_FIELD_display(field) 
+0

這似乎是正確的方式去了解它, '_get_FIELD_display()'是函數'Field.contribute_to_class()'咖喱和注入進入模型課堂。 – AKX 2012-02-15 12:35:35

+0

編輯:對不起,我必須糾正自己。它不起作用,因爲'_get_FIELD_display'方法需要一個字段作爲參數,而不是字符串。在調用我自己的'get_opposition_state_display'方法時,該字段已經變成了類的屬性... https://github.com/django/django/blob/master/django/db/models/ base.py#L581 – 2012-02-15 12:50:47

+0

我想你可以把它從self._meta中拉出來,但是在那個時候,它可能會覺得不太複雜,只是將代碼(它的所有2行)從'get_FIELD_display'中複製出來 – second 2012-02-15 12:55:49

2

要覆蓋get_FOO_display你需要的東西是這樣的:

field_name = models.PositiveSmallIntegerField('Field', choices=some_choices) 

def _get_FIELD_display(self, field): 
    f_name = field.name 
    if f_name == 'field_name': 
     return 'what_you_need' 
    return super(YourModelName, self)._get_FIELD_display(field=field)