使用户电子邮件独一无二的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'

原文由 mogoli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 305
2 个回答

最好的答案是使用 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

更新

如果您在项目中期,那么您可以按照有关如何更改迁移的 文档 进行操作,简而言之就是:

  1. 备份你的数据库
  2. 创建一个与 auth.User 相同的自定义用户模型,将其命名为 User(因此多对多表保持相同的名称)并设置 db_table=‘auth_user’(因此它使用相同的表)
  3. 删除所有迁移文件( __init__.py 除外)
  4. 从表中删除所有条目 django_migrations
  5. 使用 python manage.py makemigrations
  6. 运行假迁移 python manage.py migrate --fake
  7. 取消 db_table ,对自定义模型进行其他更改,生成迁移,应用它们

但是,如果您刚刚开始,请删除迁移目录中除 __init__.py 之外的数据库和迁移文件。然后创建一个新的数据库,通过 --- 创建一组新的迁移,并通过 python manage.py migrate python manage.py makemigrations 应用迁移。

对于其他模型中的引用,您可以将它们引用到 settings.AUTH_USER_MODEL 以避免任何未来的问题。例如:

 user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)

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

原文由 ruddra 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个工作代码

在您的任何 models.py 中使用以下代码片段

模型.py

 from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True

姜戈版本:3.0.2

参考: 具有唯一电子邮件的 Django auth.user

原文由 Jasir 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏