验证失败时Django表示字段初始值

时间:2010-03-12 11:43:30

标签: django django-forms

如何在提交表单但验证失败后设置字段元素的值? e.g。

if form.is_valid():
    form.save()
else:
    form.data['my_field'] = 'some different data'

我真的不想把它放在视图中,而宁愿把它作为表单类的一部分。

由于

3 个答案:

答案 0 :(得分:16)

documentation说:

  

如果您有一个绑定表单实例,并希望以某种方式更改数据,或者您想要将未绑定的Form实例绑定到某些数据,创建另一个表单实例。在Form实例中无法更改数据。创建Form实例后,您应该考虑其数据不可变,无论它是否有数据。

我真的不相信你的代码有效。但是没问题。根据文档,我会这样做:

if request.method == 'POST':
    data = request.POST.copy()
    form = MyForm(data)
    if form.is_valid(): 
        form.save() 
    else: 
        data['myField'] = 'some different data'
        form = MyForm(initial=data)

答案 1 :(得分:6)

我最终做了

if request.method == 'POST':
    new_data = request.POST.copy()
    form = MyForm(data=new_data)
    if form.is_valid(): 
        form.save() 
    else: 
        new_data['myField'] = 'some different data'

希望这有助于某人

答案 2 :(得分:1)

你可以将它放在这样的表单类中:

class MyForm(forms.Form):

    MY_VALUE = 'SOMETHING'
    myfield = forms.CharField(
        initial=MY_VALUE,
        widget=forms.TextInput(attrs={'disabled': 'disabled'})

    def __init__(self, *args, **kwargs):

        # If the form has been submitted, populate the disabled field
        if 'data' in kwargs:
            data = kwargs['data'].copy()
            self.prefix = kwargs.get('prefix')
            data[self.add_prefix('myfield')] = MY_VALUE
            kwargs['data'] = data

        super(MyForm, self).__init__(*args, **kwargs) 

它的工作方式是测试是否有任何数据传入表单构造函数。如果有,则复制它(未复制的数据是不可变的),然后在继续实例化表单之前放入初始值。