2011-01-02 6 views
5

Załóżmy, że chcę utworzyć i zaktualizować model. Jakie pola są wyświetlane, a rodzaj sprawdzania poprawności zależy od działania (utwórz lub zaktualizuj). Ale nadal mają wiele takich samych walidacji i funkcjonalności. Czy istnieje czysty sposób na obsłużenie tego modelu (poza sytuacją, gdy instancja istnieje wszędzie) lub czy powinienem utworzyć dwa różne formularze modelowe?Wzorce projektowe Django - formularze do tworzenia i aktualizowania modelu

Odpowiedz

4

Dwie możliwości przychodzą na myśl. Można ustawić atrybut w __init__ metoda formularza, albo na podstawie parametru jawnie przechodzą w, lub na podstawie tego, czy self.instance istnieje i ma non-None PK:

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     # either: 
     self.edit = kwargs.pop('edit', False) 
     # or: 
     self.edit = hasattr(self, instance) and self.instance.pk is not None 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     # now modify self.fields dependent on the value of self.edit 

Inną opcją jest do podklasy swoją ModelForm - zachować wspólną funkcjonalność w klasie bazowej, a następnie określoną funkcję tworzenia lub aktualizacji w podklasach.

+0

fajne, tak też myślałem. Zastanawiałam się, czy jest jakiś lepszy sposób na zrobienie tego, ale wygląda mi to dobrze. – killerbarney