默认值的 Django 表单验证错误

Posted

技术标签:

【中文标题】默认值的 Django 表单验证错误【英文标题】:Django Form validation error for default value 【发布时间】:2013-12-27 12:43:09 【问题描述】:
class CustomerForm(forms.ModelForm):

    class Meta:
        model = Customer


class Customer(models.Model):
    balance = models.FloatField(default = 0.0)

form = CustomerForm(request.POST)
if form.is_valid():
    # is FALSE

当我提交一个没有 balance 字段的表单时,我收到一个验证错误,指出余额字段是必需的。这是为什么呢?

【问题讨论】:

【参考方案1】:

required=False 足以写不检查forms.py 中的balance 字段。

还将blank=Truedefault 值放入balance model 字段

这里不需要使用clean 方法。因为每当您寻找自定义验证时,都会使用clean

django表单中自定义验证有两种方法-:

1) 你可以使用clean 方法。

2) 你可以使用forms.regexfield

【讨论】:

【参考方案2】:

您可以帮助将clean_FIELDNAME 方法添加到默认返回0.0 的表单中。 该方法在表单清理过程中被调用。

class CustomerForm(forms.ModelForm):
    balance = models.FloatField(required=False)

    def clean_balance(self):
        if not 'balance' in self.cleaned_data or self.cleaned_data['balance'] is None:
            return self._meta.model._meta.get_field('balance').default
        else:
            return self.cleaned_data['balance']

另一种处理方法是使用 forms clean 方法将 balance 字段踢出cleaned_data 并让模型设置默认值。

class CustomerForm(forms.ModelForm):

    class Meta:
        model = Customer

    def clean(self):
        if 'balance' in self.cleaned_data and self.cleaned_data['balance'] is None:
            del self.cleaned_data['balance']
        return self.cleaned_data


class Customer(models.Model):

    balance = models.FloatField(blank=True, null=False, default=0.0)

【讨论】:

唯一的问题是需要在 clean 方法中定义默认值,并且不要回退到模型中设置的默认值。 更改了 clean_ 方法以使用模型的默认值。

以上是关于默认值的 Django 表单验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Django“自动对焦”表单验证错误

为啥我的 Django 表单没有引发验证错误?

Django Formset管理-表单验证错误

附加到 Django 表单验证错误?

显示 ModelForms 的 django 表单验证错误

将 Django 模型验证错误传输到表单的惯用方式