2012-01-19 9 views
5

Mam kilka modeli, z których wszystkie mają wspólną funkcjonalność. Każdy model jest fizycznie zaopatrzonym rodzajem przedmiotu, więc udostępnia takie rzeczy, jak stock, a także udostępnia pewne rzeczy, takie jak powiadomienia o niskim stanie zapasowym (wysyła wiadomość e-mail).Django: Zastąp etykietę pola lub tekst pomocnika w pliku podrzędnym Model

Zamiast duplikować kod, napisałem abstrakcyjny model i odziedziczyłem go.

class LowStockModel(models.Model): 
    stock = stock = models.IntegerField() 
    out_of_stock_behaviour = models.CharField(max_length=20, choices=[...]) 

    class Meta: 
     abstract = True 

    def save(self, *args, **kwargs): 
     super(self.__class__, self).save(*args, **kwargs) 
     if self.stock <= 0: 
      #... 

Moim problemem jest to, że trzeba zmienić etykietę lub dodać inny help_text do pola stock w klasach potomnych ja tarłem. Jest to bardzo ważne, ponieważ klient (i jego pracownicy) potrzebują instrukcji na temat jednostek. Próbowałem munging wokół dziecka __init__, ale nigdzie się nie dostaję.

tl; dr Jak zmienić etykietę na polu z modelu podrzędnego?

+0

Nie rób tego: 'super (self .__ class__, self)' Możesz łatwo uzyskać nieskończoną rekursję. – DrTyrsa

+3

To nie będzie ładne, ale: http://stackoverflow.com/a/928774/16361 – AdamKG

+0

Dzięki @AdamKG to jest idealne. – Oli

Odpowiedz

1

Kiedy dziedziczenie jest wykonany z klasy abstrakcyjnej, w Django może chcesz używać:

CustomClass._meta.get_field('yourfield').verbose_name = 'Your custom text'

klasach powinno być tak:

class AncestorClass(models.Model): 
    stock = models.CharField(max_length=50, verbose_name='AncestorStockName') 
    # etc ... 

A teraz powinniśmy dostosować dziecko Klasa taka jak ta:

class ChildClass(AncestorClass): 
    stock = models.CharField... # Customize your stock field 

ChildClass._meta.get_field('stock').verbose_name = 'CustomVerboseStock' 
0

To powinno działać:

class MyForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['stock '].label = "any label"