代码之家  ›  专栏  ›  技术社区  ›  mogoli

使用户电子邮件独一无二

  •  1
  • mogoli  · 技术社区  · 6 年前

    当用户注册时,如何使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用户的。 我需要重写模型中的用户吗?目前,该模型没有引用用户。

    VIEW

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

    谢谢你的想法。

    2 回复  |  直到 6 年前
        1
  •  3
  •   ruddra    6 年前

    最好的答案是使用 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 关于如何更改迁移,简而言之,这是为了:

    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 ,对自定义模型进行其他更改,生成迁移,应用它们

    但是,如果您刚开始,那么删除迁移目录中的db和migrations文件,除了 π介子 . 然后创建一个新的数据库,创建新的迁移集 python manage.py生成迁移 和应用迁移 python manage.py migrate .

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

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

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

        2
  •  0
  •   joshlsullivan    6 年前

    在Django的文档中有一个很好的例子- https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example .

    您必须在 AbstractBaseUser 模型AS unique=True .

    class MyUser(AbstractBaseUser):
        email = models.EmailField(
            verbose_name='email address',
            max_length=255,
            unique=True,
        )
        date_of_birth = models.DateField()
        is_active = models.BooleanField(default=True)
        is_admin = models.BooleanField(default=False)