2013-03-01 2 views
1

Я использую вид формы Django, и я хочу ввести пользовательские выборы для каждого пользователя в мой Choicefield.CBV Django Form View данные набора для ChoiceField

Как я могу это сделать?

Можно ли использовать функцию get_initial? Можно ли переписать поле?

ответ

1

Когда я хочу изменить некоторые вещи о форме, такой как текст метки, добавляя обязательные поля или фильтруя список вариантов и т. Д. Я следую шаблону, где я использую 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