首页 文章

在clean()期间修改Django表单字段的值

提问于
浏览
21

我在我的Django应用程序中添加自定义验证到我的表单和自定义字段 . 我希望能够在触发错误时修改字段的值 . 例如,如果出现错误,则应使用clean()更正的字段值重新显示表单,并显示错误消息“下面已更正数据 . 再次单击”保存“以确认这些更改是否正常”

我已经尝试在cleaning_data []中返回修改后的数据,但它不起作用 . 它正确显示错误,但在重新显示表单时,不会使用更正后的HTML更新字段值 .

class T34AtividadeForm(ModelForm):
    def clean(self):
        # Return cleaned html
        error,html = fix_imgs(cleaned_data.get("a34_descricao"))
        if error:
            msg = u'Data has been corrected below. Click save again to confirm if these changes are OK';
            self._errors['a34_descricao'] = ErrorList([msg])
            # This doesn't work
            cleaned_data["a34_descricao"] = html
            # This doesn't work either
            self.a34_descricao = html

    return cleaned_data

我也喜欢用字段做同样的事情,但由于错误是由异常触发的,我没有机会返回修正后的值 . 与表单clean()方法一样,错误显示正确,但值不会更新 .

class HTMLField(CharField):
    widget = HTMLTextarea

    def clean(self, value):
        value = super(HTMLField,self).clean(value)
        error,html = fix_imgs(value)
        if error:
            # This doesn't work
            self.value = html
            raise forms.ValidationError(u'Data has been corrected below. Click save again to confirm if these changes are OK.')
        return html

5 回答

  • 0

    更改clean方法中的self数据以更改显示的值

  • 3

    在clean()中更新值的方法是更新表单数据字典中的值:

    self.data["a34_stuff"] = "html"
    

    这肯定有用 .

  • 0

    这是我试过并为我工作的方式:

    inst = my_form.save(commit=False)
     if not inst.a34_stuff: # or incorrect
         inst.data["a34_stuff"] = "corrected"
    
  • 6

    如果更新表单的 self.data 属性,则可以在 clean() 期间修改字段的值 . self.dataQueryDict类的一个实例 . 默认情况下,querydicts是不可变的 . 要使它们可变,您应该使用 .copy() 方法 . 从文档:

    在正常的请求/响应周期中访问时,request.POST和request.GET上的QueryDicts将是不可变的 . 要获得可变版本,您需要使用QueryDict.copy()

    self.data = self.data.copy()
    self.data['your_field'] = 'new value'
    
  • -2

    如果您的表单是模型表单,则更好的方法是获取实例并更正该数据:

    inst = my_form.save(commit=False)
    if inst.a34_stuff is None: #or incorrect
        inst.a34_stuff = "corrected"
        request.user.message_set.create(message = "Error corrected")
        return HttpResponseRedirect(reverse('your_url_name',
                args=[])
    

    PS:我不确定这是否真的有效......不确定表格是否会改变 .

相关问题