2012-02-15 32 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)