3

如何使用该clean方法更改 Django 表单集的每种表单中的字段?

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
        ...?
4

2 回答 2

1

根据 ssomnoremac 评论,我在 BaseModelFormSet clean 方法中使用了 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

于 2018-05-17T14:20:31.773 回答
0

我相信您通过遍历每个表单并设置清理后的数据(您的第二个示例)走在正确的轨道上。BaseFormSet 有一个名为的属性cleaned_data,它返回每个表单的已清理数据的列表。那是你要的吗?例如:

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(...)
于 2014-03-31T15:43:43.943 回答