繁体   English   中英

使用clean更改Django formset中的字段

[英]Alter fields in Django formset using clean

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

我相信您可以通过遍历每种表单并设置清除的数据来走上正确的轨道(第二个示例)。 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(...)

基于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM