2012-12-18 13 views
6

, ben() yöntemlerini geçersiz ve süper kullanmanın Python yolunda aşina değilim get_FOO_display geçersiz kılar.Django:() Genel olarak

soru şudur: Ben get_FOO_display() geçersiz kılabilir?

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

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

benim ekran çoğul istedikleri için() get_FOO_display geçersiz kılmak istiyorum.

Ama super(A, self).get_unit_display() çalışmaz.

cevap

7

Normalde sadece bir yöntemi geçersiz kılar. Ama burada hüner get_FOO_display yöntem böylece super yöntem hiç bir şey yapacağız çağırarak, üst sınıf mevcut olmadığıdır. Metot, modele meta sınıf tarafından eklendiğinde, alan sınıfı tarafından dinamik olarak eklenir - bkz. the source here.

Yapabileceğiniz tek şey, unit alanınız için özel bir Alan alt sınıfı tanımlamak ve contribute_to_class'u geçersiz kılmak, böylece istediğiniz yöntemi oluşturmaktır. Maalesef biraz zor.

(Ben senin ikinci soruyu anlamadım. Tam olarak ne istiyorsunuz?) Başka herhangi bir düzenli yöntem ama diğer yanıtında işaret gibi get_FOO_display, özel Django sihirle oluşturulursa

+0

Üzgünüm, açıklamamış 2'nci soruyu görmezden gel. Anladım. – dtc

-3

Sen alt sınıf aynı isimde bir yöntem yaratarak bir süper sınıfına herhangi bir yöntemi geçersiz kılmak için mümkün olmalıdır. Argüman imzası dikkate alınmaz. Örneğin:

get_unit_display() durumunda
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" 

, size ekran değerini değiştirmek isterseniz, hiç) super (aramak zorunda değilsiniz, ancak super() kullanmak istiyorsanız, sağlamak bu örneğin, doğru imzayla diyoruz: biz() 'in super get_unit_display değerini geçiyoruz

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 

Not(). Eğer gösterdiği gibi

+2

Bu doğru olurdu . –

İlgili konular