如何使用clean
方法更改Django formset的每种形式的字段?
class MyInlineFormSet(BaseInlineFormSet):
def clean(self):
if self.cleaned_data['inputted'] == self.cleaned_data['answer']:
self.cleaned_data['is_correct'] = True
return self.cleaned_data
这不起作用,我看到人们遍历每个表单,但他们只验证而不是改变。如果我遍历每个表单,我该如何返回cleaned_data
?换句话说:
class MyInlineFormSet(BaseInlineFormSet):
def clean(self):
for form in self.forms:
if form.cleaned_data['inputted'] == form.cleaned_data['answer']:
form.cleaned_data['is_correct'] = True
...?
答案 0 :(得分:0)
我相信你通过遍历每个表单并设置清理过的数据(第二个例子)而走在正确的轨道上。 BaseFormSet有一个名为cleaned_data
的属性,它返回每个表单的已清理数据列表。那是你要的吗? E.g:
return self.cleaned_data
它确实会返回:
[form.cleaned_data for form in self.forms]
如果我正确读取代码,应具有正确的数据(经过修改)。
如果您只想保存模型中的值,建议您避免使用clean
方法,而是覆盖save
方法:
def save_new(self, form, commit=True):
form.instance.is_correct = ...
return super(...).save_new(...)
def save_existing(...)
答案 1 :(得分:0)
基于ssomnoremac注释,我在BaseModelFormSet清理方法中使用了form.instance.field_i_wanted_to_change而不是form.cleaned_data [' field_i_wanted_to_change']并且它有效。像
这样的东西class MyInlineFormSet(BaseInlineFormSet):
def clean(self):
for form in self.forms:
if form.cleaned_data['inputted'] == form.cleaned_data['answer']:
form.instance.is_correct = True
就我而言,我已经调用了clean_field_i_wanted_to_change,因此订单是clean_field> clean @ MyInlineFormSet Django 1.11