python - 使用户电子邮件唯一 django
问题描述
用户注册时,如何使 Django 用户电子邮件独一无二?
表格.py
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 的用户。我是否需要覆盖模型中的用户。目前该模型不引用用户。
视图.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
方法以进行验证。例如:
from django.core.exceptions import ValidationError
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
更新
如果您处于项目中期,那么您可以按照有关如何更改迁移的文档进行操作,简而言之:
- 备份你的数据库
- 创建一个与 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)
它将自动引用当前的用户模型。
推荐阅读
- java - 使用 java 高级别的客户端的自定义 Elastic Search Alias Api
- python - AttributeError:“ModbusIOException”对象没有属性“注册”与 Kinova 机器人 ModBus 代码
- php - 如何根据选择的交付选项隐藏 Woocommerce 中的特定付款方式
- java - FlashDevelop Java 32 位问题 - 没有调试器
- html - 我需要一个包含以下内容的 HTML 生成的电子邮件
- vbscript - 调试 VBScript - 即时调试器需要提升吗?
- javascript - console.dir(event.target.value) 是空字符串,但 console.dir(event) 显示 value 属性的“完整字符串”
- data-structures - 谁能帮我解决这个二维自定义数组表示
- fpga - 收发器工作频率低于 FPGA 中的 IP 设置
- angular - 如何管理 Azure AD b2c 应用程序?