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

时间:2011-04-24 23:36:16

标签: python django django-authentication

我使用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

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

6 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分:1)

我不知道如何使用它,但

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

class User(AbstractUser):
...

class Meta:
    unique_together = ('email',)

答案 5 :(得分:0)

在进行注册时,我发现 django auth 中不需要电子邮件,但在简单验证时,如果我们不提供电子邮件,则会出现 500 错误,因为我们必须在后端检查电子邮件。< /p>

因此,要使其成为必需,请添加到 registrationSerializer;

extra_kwargs = {'email': {'required': True}}

对于独特的电子邮件,其他答案表明了这一点。