如何使 Django 表单字段唯一?

Posted

技术标签:

【中文标题】如何使 Django 表单字段唯一?【英文标题】:How to make Django form Field Unique? 【发布时间】:2019-03-09 10:32:41 【问题描述】:

我有一个注册表单,我想让电子邮件和手机号码字段的数据唯一......

class SignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.', unique=True)
    mobile_no = forms.CharField(validators=[max_length=17, initial='+91', unique=True)  

我目前正在使用unique=True,但它引发错误...

TypeError: __init__() got an unexpected keyword argument 'unique'

【问题讨论】:

我猜你需要在模型中指定这个并在表单中进行自定义验证 参数“唯一”适用于模型。文档链接:unique 【参考方案1】:

最简单、最快的方法(对您和服务器而言)是通过设置 unique=True 在您的模型中实现它。 如果你想要它的形式,你需要覆盖干净

清理邮箱:

class SignUpForm(UserCreationForm):
    ...

    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise ValidationError("Email already exists")
        return email

现在form.is_valid() 将在具有给定电子邮件的用户帐户已经存在时抛出错误。 我想你现在可以弄清楚如何为手机号码做同样的事情了。

【讨论】:

这不适用于更改表单,因为它可能已经存在(例如,在未更改的情况下)会引发错误。

以上是关于如何使 Django 表单字段唯一?的主要内容,如果未能解决你的问题,请参考以下文章

如何使子类化的自定义 Django 表单字段不再是必需的?

Django:如何使表单有条件?

Django - 如何排除表单字段视图?

提交后如何使表单域为空

在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?

如何使 Ninja Forms 3.1 中的字段唯一?