Django ModelForm 浮点字段不调用 Clean_Field 方法
Posted
技术标签:
【中文标题】Django ModelForm 浮点字段不调用 Clean_Field 方法【英文标题】:Django ModelForm float field not calling Clean_Field method 【发布时间】:2013-10-06 08:19:16 【问题描述】:我遇到了一个独特的问题。 我在我的 floatField 中输入了“90 美元”的值。 我认为它应该被清理并在模型中存储为“90.0”。
但是当我输入“$90”并调用 clean_filed 方法时,它不会调用该 clean 方法。 但是当我在 clean(self) 方法上应用断点并尝试获取它的值时,它说 None。
请帮帮我。这是我的代码。
Model
class Project(models.Model):
foo = models.FloatField("foo",
null=True, blank=True
)
forms
widgets =
'foo': forms.TextInput(attrs='currency': 'true')
def clean_foo(self):
value = self.cleaned_data.get('foo')
print value # i get NONE here.............
return value
【问题讨论】:
您是否尝试过其他输入?像没有“$”符号的“90”还是已经干净的“90.0”?试试看是否真的是清洁问题而不是其他问题 【参考方案1】:表单 API 中的 clean_<field>
钩子用于进行附加验证。在字段调用其 clean 方法后调用它。如果该字段认为输入无效,则不会调用 clean_<field>
。这在自定义验证文档 https://docs.djangoproject.com/en/stable/ref/forms/validation/
对于任何字段,如果 Field.clean() 方法引发 ValidationError,则不会调用任何特定于字段的清理方法。但是,仍然会执行所有剩余字段的清理方法。
在您的情况下,因为 $90
没有验证为浮点数,因此不会被调用。相反,您应该做的是创建FloatField
的子类,在将输入验证为浮点数之前清理输入(删除$
等)。
【讨论】:
以上是关于Django ModelForm 浮点字段不调用 Clean_Field 方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 中向 ModelForm 添加非模型字段?
Django ModelForm booleanfield 必填字段不起作用
Django使用不完整的模型创建一个有效的ModelForm,以在表单验证后手动添加字段