使用户电子邮件唯一django

mog*_*oli 3 django

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

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

  • 到目前为止,将用户模型电子邮件地址限制为唯一的最简单方法 - 如果表中还没有非唯一值,您甚至可以将其合并到现有项目中。 (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)

更新资料

如果您处于中间项目中,则可以遵循文档有关如何更改迁移,简而言之是:

  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 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)