Когда я хочу изменить некоторые вещи о форме, такой как текст метки, добавляя обязательные поля или фильтруя список вариантов и т. Д. Я следую шаблону, где я использую ModelForm и добавляю к нему несколько полезных методов, которые содержат мой главный код (это помогает поддерживать __init__
аккуратно). Затем эти методы вызывают от __init__
, чтобы переопределить значения по умолчанию.
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('country', 'contact_phone',)
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
self.set_querysets()
self.set_labels()
self.set_required_values()
self.set_initial_values()
def set_querysets(self):
"""Filter ChoiceFields here."""
# only show active countries in the ‘country’ choices list
self.fields["country"].queryset = Country.objects.filter(active=True)
def set_labels(self):
"""Override field labels here."""
pass
def set_required_values(self):
"""Make specific fields mandatory here."""
pass
def set_initial_values(self):
"""Set initial field values here."""
pass
Если ChoiceField
это единственное, что вы собираетесь настраивать, это все, что вам нужно:
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('country', 'contact_phone',)
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
# only show active countries in the ‘country’ choices list
self.fields["country"].queryset = Country.objects.filter(active=True)
Вы можете сделать свой FormView использовать эту форму, как это:
class ProfileFormView(FormView):
template_name = "profile.html"
form_class = ProfileForm