我使用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
我想将电子邮件设置为唯一身份验证并检查表单以进行此验证。我该怎么办?
答案 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}}
对于独特的电子邮件,其他答案表明了这一点。