2012-12-18 126 views
6

一般來說,我不熟悉Python的重寫方法和使用super()的方式。Django:覆蓋get_FOO_display()

問題是:我可以覆蓋get_FOO_display()

class A(models.Model): 
    unit = models.IntegerField(choices=something) 

    def get_unit_display(self, value): 
    ... use super(A, self).get_unit_display() 

我想重寫get_FOO_display(),因爲我想複數化我的顯示。

super(A, self).get_unit_display()不起作用。

回答

7

通常情況下,您只需重寫一個方法,如您所示。但這裏的訣竅是get_FOO_display方法不存在於超類中,因此調用super方法將不會執行任何操作。當元類添加到模型中時,該方法由字段類動態添加 - 請參閱the source here

你可以做的一件事是爲你的unit字段定義一個自定義字段子類,並覆蓋contribute_to_class,以便它構建你想要的方法。不幸的是,這有點棘手。

(我不明白你的第二個問題。你到底是問什麼?)

+0

對不起,忽略我解釋不好的第二個問題。我明白了。 – dtc

-3

您應該可以通過在子類上創建一個名稱相同的方法來覆蓋超類的任何方法。不考慮參數簽名。例如:

class A(object): 
    def method(self, arg1): 
     print "Method A", arg1 

class B(A): 
    def method(self): 
     print "Method B" 

A().method(True) # "Method A True" 
B().method() # "Method B" 

在get_unit_display()的情況下,你不必調用super()在所有的,如果你想改變顯示的值,但如果你想使用超(),確保你與正確的簽名調用它,例如:

class A(models.Model): 
    unit = models.IntegerField(choices=something) 

    def get_unit_display(self, value): 
     display = super(A, self).get_unit_display(value) 
     if value > 1: 
      display = display + "s" 
     return display 

注意,我們傳遞的價值超()的get_unit_display()。

+2

這將是真實的,如果它是任何其他的常規方法,但get_FOO_display是由特殊的Django魔術創造,像指向對方的回答。 –