当用户注册时,如何使Django用户电子邮件唯一?
表格
class SignUpForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(SignUpForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
if commit:
user.save()
return user
Run Code Online (Sandbox Code Playgroud)
我正在使用django.contrib.auth.models用户。我是否需要在模型中覆盖用户。当前,该模型未引用用户。
views.py
class SignUp(generic.CreateView):
form_class = SignUpForm
success_url = reverse_lazy('login')
template_name = 'signup.html'
Run Code Online (Sandbox Code Playgroud)
感谢您的想法。
Jas*_*sir 12
这是一个工作代码
在您的任何 models.py 中使用以下代码片段
模型.py
from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True
Run Code Online (Sandbox Code Playgroud)
Django 版本:3.0.2
rud*_*dra 11
最好的答案是CustomUser通过将子类化AbstractUser并在其中放置唯一的电子邮件地址来使用。例如:
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
email = models.EmailField(unique=True)
Run Code Online (Sandbox Code Playgroud)
并使用来更新设置 AUTH_USER_MODEL="app.CustomUser"。
但是,如果您不必将唯一的电子邮件存储在数据库中,或者不必将其用作用户名字段,则可以更新表单的clean方法以进行验证。例如:
class YourForm(UserCreationForm):
def clean(self):
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exists():
raise ValidationError("Email exists")
return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)
如果您处于中间项目中,则可以遵循文档有关如何更改迁移,简而言之是:
__init__.py)django_migrationspython manage.py makemigrationspython manage.py migrate --fakedb_table,对自定义模型进行其他更改,生成迁移并应用它们但是,如果您只是开始,请删除迁移目录中的数据库和迁移文件(除外)__init__.py。然后创建一个新的数据库,通过创建新的迁移集,python manage.py makemigrations并通过应用迁移python manage.py migrate。
对于其他模型中的参考,可以参考它们settings.AUTH_USER_MODEL以避免将来出现任何问题。例如:
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
Run Code Online (Sandbox Code Playgroud)
它将自动引用当前的用户模型。
小智 5
Django 3.1 的工作代码
模型.py
from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True
SETTINGS.PY
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend'
]
Run Code Online (Sandbox Code Playgroud)