如何在Django视图中排除表单字段

时间:2018-08-31 12:40:43

标签: django forms

我正在使用Django 1.9.5 我在视图中使用表格。 在我的视图中,我将在forms.py中将相同的表单用于GET和POST。 我想排除一个字段,如果它是GET。 我希望它显示所有字段,如果它是POST。 我不希望在form.py中使用2种不同的形式来显示相同​​的视图。

Views.py

method = 'GET'
mine_form = MineForm(prefix='mine', method=method)

Forms.py

class MineForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput, required=False)
    re_password = forms.CharField(
        widget=forms.PasswordInput, label='Re-type Password', required=False)

    class Meta:
        model = Mine
        exclude = []
        widgets = {
            'gender': forms.RadioSelect(renderer=HorizontalRadioRenderer),
            'uuid': forms.HiddenInput(),
        }
        exclude = ['user', ]

        def __init__(self, *args, **kwargs):
            self.method = kwargs.pop('method', None)
            super(MineForm).__init__(*args, **kwargs)
            if self.method == 'GET':
                self.fields.pop('delete_mine')

2 个答案:

答案 0 :(得分:0)


覆盖表单的 __init__() 方法
class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)
    age = forms.IntegerField()

    def __init__(self, *args, **kwargs):
        self.method = kwargs.pop('method', None)
        super(NameForm, self).__init__(*args, **kwargs)
        if self.method == 'GET':
            self.fields.pop('age')

,并且在您的视图中将method参数传递为,

def get_name(request):
    if request.method == 'POST':
        form = NameForm(request.POST, method='POST')
        if form.is_valid():
            return HttpResponseRedirect('/thanks/')
    else:
        form = NameForm(method='GET')

    return render(request, 'name.html', {'form': form})

答案 1 :(得分:0)

如果是GET请求,您可以直接从fields字典中删除该字段:

if request.method == 'GET':
    del self.fields["yourField"]