Django auth.user,带有独特的电子邮件

问题描述 投票:6回答:5

我使用django.auth系统,我是这样的:

class RegisterForm(UserCreationForm):
    username = forms.RegexField(label= "Username" , max_length = 30, regex = r'^[\w]+$', error_messages = {'invalid': "This value may contain only letters, numbers and _ characters."})
    email = forms.EmailField(label = "Email")
    first_name = forms.CharField(label = "First name", required = False)
    last_name = forms.CharField(label = "Last name", required = False)

    class Meta:
        model = User
        fields = ("username", "first_name", "last_name", "email", )

    def save(self, commit = True):
        user = super(RegisterForm, self).save(commit = False)
        user.first_name = self.cleaned_data["first_name"]
        user.last_name = self.cleaned_data["last_name"]
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

我想将电子邮件设置为唯一身份验证并检查表单以进行此验证。我该怎么做?

python django django-authentication
5个回答
9
投票

将其添加到您的表单中。但这不是完美的方式。只有使用此表格才能获得竞争条件。我建议你在db级别添加唯一约束。

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

SQL添加唯一约束:

ALTER TABLE auth_user ADD UNIQUE (email)

16
投票

你模特的某个地方:

from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True

请注意unique之前的下划线。这是实际保存信息的地方。 User._meta.get_field('email').unique只是一个调查它的@property

这也适用于syncdb,因此您将与数据库保持一致。

请注意,从Django 1.5开始,您将不必执行此类操作,因为用户模型将是可插入的。


1
投票

我不知道如何使用它,但是

from django.contrib.auth.models import User
User._meta.get_field_by_name('email')[0].unique=True

应该这样做。我想在auth模型上运行syncdb之前,这会出现在models.py中。回合自己尝试一下。


0
投票

这里描述了覆盖mumimo建议的clean()方法:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

通常你可以在你的字段定义中使用unique = True,然后使用ModelForm,这样它就会自动为你表单中的所有字段运行clean(),但是如果你正在使用django.auth用户类,你可以'修改字段。


0
投票

你可以在抽象用户模型中使用它做同样的事情:

class User(AbstractUser):
...

class Meta:
    unique_together = ('email',)
© www.soinside.com 2019 - 2024. All rights reserved.