gpt4 book ai didi

django - 使用户电子邮件唯一django

转载 作者:行者123 更新时间:2023-12-03 12:08:57 24 4
gpt4 key购买 nike

当用户注册时,如何使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


我正在使用django.contrib.auth.models用户。
我是否需要在模型中覆盖用户。当前,该模型未引用用户。

views.py

class SignUp(generic.CreateView):
form_class = SignUpForm
success_url = reverse_lazy('login')
template_name = 'signup.html'


感谢您的想法。

最佳答案

最好的答案是通过将CustomUser子类化并在其中放置唯一的电子邮件地址来使用AbstractUser。例如:

from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
email = models.EmailField(unique=True)


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


更新资料

如果您处于项目中期,则可以按照 documentation更改迁移方式,简而言之是:


备份数据库
创建一个与auth.User相同的自定义用户模型,将其命名为User(许多表保持相同的名称)并设置db_table ='auth_user'(因此它使用同一表)
删除所有迁移文件( __init__.py除外)
删除表 django_migrations中的所有条目
使用 python manage.py makemigrations创建所有迁移文件
通过 python manage.py migrate --fake运行假迁移
取消设置 db_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)


它将自动引用当前的用户模型。

关于django - 使用户电子邮件唯一django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com