【问题标题】:Custom cleaning form data in djangodjango中的自定义清理表单数据
【发布时间】:2012-07-06 06:32:09
【问题描述】:

我知道如何清理 django 的 forms.py 中的数据,但我遇到了一个以前从未遇到过的奇怪错误

这是我的forms.py:

class BetaPhoneForm(ModelForm):
class Meta:
    model = RegisterHotTable
    fields = ('pracPhone',)

def clean_pracPhone(self):
    pracPhone = self.cleaned_data['pracPhone']

    if pracPhone is None:
        raise forms.ValidationError("This value cannot be empty")
    else:
        if not pracPhone.isdigit():
            raise forms.ValidationError("Please enter a valid phone number.")
    return pracPhone

所以我正在使用自定义清理方法 clean_pracPhone 清理我的字段。当我将值留空并看到“此值不能为空”时,它适用于部分

我希望表单显示错误“请输入有效的电话号码”。当我输入字母而不是数字时,而不是标准的“输入整数”。

事实上,我意识到当我输入字母时,这个方法甚至没有运行。

我知道我可以通过创建自定义字符字段而不使用 ModelForm 来“破解”这个问题,但我真的不想这样做。

我也试过用 self.data 代替 self.cleaned_data 但没用。

任何想法我如何使它工作。

谢谢!

【问题讨论】:

  • 你检查过那个方法中pracPhone的值了吗?该方法是否运行,您是否确实得到了您期望的字符串?
  • 是的,我检查了这个。 pracPhone 的值始终为空白,除非我做正确的事情并输入一个数字。它就像在调用此方法之前进行验证的一部分。我怀疑cleaned_data 已经在验证这一点。而且我不知道如何防止它

标签: django forms validation


【解决方案1】:

根据您的错误消息,我假设pracPhone 在您的模型中由models.IntegerField 表示。这意味着在您的 ModelForm 中,该字段由 forms.IntegerField 表示。

forms.IntegerField 默认带有一些验证:

  • 需要
  • 无效
  • min_value
  • 最大值

您应该覆盖IntegerField 上的默认验证消息。

class BetaPhoneForm(forms.ModelForm):

    pracPhone = forms.IntegerField(error_messages={
        "required": "This value cannot be empty.",
        "invalid": "Please enter a valid phone number.",
    })

    class Meta:
        model = RegisterHotTable
        fields = ('pracPhone',)

    def clean_procPhone(self):
        pracPhone = self.cleaned_data['pracPhone']
        # your other validations go here.
        return pracPhone

【讨论】:

  • 是否可以在表单上使用一个干净的方法来过滤特定类型的字段?所以所有的 IntegerFields 都可以用同样的方式清理?
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2010-09-23
  • 2014-11-14
  • 1970-01-01
  • 2012-03-26
  • 2019-08-07
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多