Fre*_*ins 6 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
Run Code Online (Sandbox Code Playgroud)
我想将电子邮件设置为唯一身份验证并检查表单以进行此验证.我该怎么做?
小智 17
你模特的某个地方:
from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True
Run Code Online (Sandbox Code Playgroud)
请注意以前的下划线unique.这是实际保存信息的地方.User._meta.get_field('email').unique只是一个调查@property它.
这也适用于syncdb,因此您将与数据库保持一致.
请注意,从Django 1.5开始,您将不必执行此类操作,因为用户模型将是可插入的.
将其添加到您的表单中.但这不是完美的方式.只有使用此表格才能获得竞争条件.我建议你在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
Run Code Online (Sandbox Code Playgroud)
SQL添加唯一约束:
ALTER TABLE auth_user ADD UNIQUE (email)
Run Code Online (Sandbox Code Playgroud)