2012-12-18 14 views
6

Ogólnie nie jestem zaznajomiony z sposobem Pythona nadpisywanie metod i przy użyciu super().Django: przesłonić get_FOO_display()

pytanie brzmi: czy mogę przesłonić 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() 

Chcę zastąpić get_FOO_display() bo chcę pluralize mój wyświetlacz.

Ale super(A, self).get_unit_display() nie działa.

Odpowiedz

7

Zazwyczaj wystarczy zastąpić metodę, jak pokazano. Ale sztuczka polega na tym, że metoda get_FOO_display nie występuje w nadklasie, więc wywołanie metody super nic nie da. Metoda jest dodawana dynamicznie przez klasę pola, gdy jest dodana do modelu przez metaklas - patrz the source here.

Jedną z rzeczy, którą można zrobić, to zdefiniować niestandardową podklasę Field dla swojego pola unit i zastąpić contribute_to_class, aby utworzyć wybraną metodę. Niestety, jest to dość trudne.

(nie rozumiem drugie pytanie. Co dokładnie pytasz?)

+0

Przepraszam, zignoruj ​​moje słabo wyjaśnione drugie pytanie. Rozumiem to. – dtc

-3

Powinieneś być w stanie zastąpić dowolną metodę na super klasie, tworząc metodę o tej samej nazwie w podklasie. Podpis argumentu nie jest brany pod uwagę. Na przykład:

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" 

W przypadku get_unit_display(), nie trzeba zadzwonić super() w ogóle, jeśli chcesz zmienić wyświetlaną wartość, ale jeśli chcesz używać super(), zapewnienie że jesteś nazywając ją z prawidłowym podpisem, na przykład:

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 

pamiętać, że jesteśmy przechodzącej wartość do super() 's get_unit_display().

+2

Byłoby to prawdą, gdyby to był jakikolwiek inny sposób regularny, ale get_FOO_display jest tworzony przez specjalną magię Django, jak wskazała w drugiej odpowiedzi . –

Powiązane problemy