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
5
A
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.
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