CBV Django表单视图为ChoiceField设置数据

时间:2013-03-01 16:07:31

标签: django django-forms django-views

我正在使用Django表单视图,我希望为每个用户输入Choicefield的自定义选项。

我该怎么做?

我可以使用get_initial函数吗? 我可以覆盖这个字段吗?

1 个答案:

答案 0 :(得分: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