在' def form_invalid'上更改表单字段值使用基于类的视图

时间:2016-12-15 16:29:45

标签: django

我正在使用基于django类的视图中的CreateView进行表单提交,并且我在clean方法上定义了一个特殊的验证:

class MyModelCreateForm(forms.ModelForm):
    quantity = forms.IntegerField(
        label='quantity',
    )

    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        initial_quantity = kwargs.pop('initial_quantity')
        super(MyModelCreateForm, self).__init__(*args, **kwargs)
        self.fields['quantity'].initial = initial_quantity

    def clean(self):
        # Don't take care of random_int definition
        if self.cleaned_data['quantity'] != random_int:
            raise forms.ValidationError(
                'There is a bug',
            )

'数量'字段具有默认初始值(initial_quantity),如果此数字与“random_int”不同,则表单将无效,并且视图将返回带有' form_errors'的表单。用于向用户显示。好的,在这一点上,我需要设置'数量的值'字段到' random_int',然后,下次用户提交表单时,视图响应将由form_valid方法处理。

我尝试编辑数量' ' form_invalid'上的字段值方法,但不起作用。错误被正确地提出但是,'数量的值是'字段是" initial_quantity'又:

views.py

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelCreateForm

    def get_form_kwargs(self):
        kwargs = super(MyModelCreateView, self).get_form_kwargs()
        kwargs.update({'initial_quantity': 10})
        return kwargs

    def get_form(self, form_class=MyModelCreateForm):
        form = form_class(**self.get_form_kwargs())
        return form

    def form_valid(self, form):
        my_object = form.save()
        return HttpResponseRedirect(my_object.get_absolute_url())

    def form_invalid(self, form, **kwargs):
        ctx = self.get_context_data(**kwargs)
        random_int = random.randint(0,20)
        form.fields['quantity'].initial = random_int # Tried to change value here, but is not working
        ctx['form'] = form
        return self.render_to_response(ctx)

如何在表单无效响应中编辑表单字段值?谢谢:)。

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解您的问题,但您可能需要clean方法。表单中的每个字段都有一个带有特殊命名(clean_fieldname)的干净方法。你可以像下面那样覆盖它:

def clean_quantity(self):
    value = self.cleaned_data['quantity']
    # check anything you want here and return the desired value.
    value = self.random_int # or something else
    return value

更多详情为here

答案 1 :(得分:0)

在表单上设置 initial 不起作用的原因是当表单到达 form_invalid 方法时,表单已绑定initial 值仅针对未绑定表单显示(当表单没有数据时)。

更改 form_invalid 中表单数据的一种方法如下:

def form_invalid(self, form, **kwargs):
    ctx = self.get_context_data(**kwargs)
    random_int = random.randint(0,20)
    form.data = form.data.copy()       <--- make a copy
    form.data['quantity'] = random_int <--- assign value
    ctx['form'] = form
    return self.render_to_response(ctx)