我在我的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
答案 0 :(得分:6)
更改clean方法中的self数据以更改显示的值
答案 1 :(得分:3)
更新clean()中的值的方法是更新表单数据字典中的值:
self.data["a34_stuff"] = "html"
这肯定有用。
答案 2 :(得分:1)
如果更新表单的clean()
属性,则可以在self.data
期间修改字段的值。 self.data
是QueryDict类的实例。默认情况下,querydict是不可变的。要使它们可变,您应该使用.copy()
方法。从文档中:
在正常的请求/响应周期中访问request.POST和request.GET时的QueryDicts将是不可变的。要获得可变版本,您需要使用QueryDict.copy()
self.data = self.data.copy()
self.data['your_field'] = 'new value'
答案 3 :(得分:1)
我在另一个清理函数中为特定字段设置了一个值,但由于它被主要清理函数覆盖而无法正常工作。为了设置并保留该值:
def clean_tipo_cupon(self):
tipo_cupon = self.cleaned_data['tipo_cupon']
qscu = mdlcat.TipoCuponVenta.objects.filter(
id=tipo_cupon, estado_id=1,
)
if not qscu.exists():
wmessage = u'introducido no paso validación'
raise forms.ValidationError(wmessage)
qscu = qscu.first()
if not qscu.default_owner is None:
self.cleaned_data['default_owner'] = qscu.default_owner.id
return tipo_cupon
def clean(self):
cleaned_data = super().clean()
for item in self.fields.keys():
if isinstance(cleaned_data.get(item), str):
cleaned_data[item] = cleaned_data.get(item).upper()
# if a default owner is configured by coupon type
# it will be assigned
tipo_cupon = cleaned_data['tipo_cupon']
qscu = mdlcat.TipoCuponVenta.objects.filter(
id=tipo_cupon, estado_id=1,
)
qscu = qscu.first()
if not qscu.default_owner is None:
self.cleaned_data['default_owner'] = qscu.default_owner.id
return cleaned_data
答案 4 :(得分:0)
这是我尝试过并为我工作的方式:
inst = my_form.save(commit=False)
if not inst.a34_stuff: # or incorrect
inst.data["a34_stuff"] = "corrected"
答案 5 :(得分:0)
我们无法重新编辑request.data
,因为它是不变的字典。您需要将其复制,处理并返回。
但是在找到不同的解决方案之后,我发现这种方式(在Django 2.2.6中测试)
class MyForm(ModelForm):
def clean(self):
cleaned_data = super(MyForm, self).clean()
self.instance.field = 'value'
return cleaned_data
答案 6 :(得分:-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:我不确定这是否真的有效......不确定表格是否会改变。