使用clean更改Django formset中的字段

时间:2014-03-30 00:10:55

标签: python django forms inline-formset formsets

如何使用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
        ...?

2 个答案:

答案 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