我正在使用基于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)
如何在表单无效响应中编辑表单字段值?谢谢:)。
答案 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)