如何使用电子邮件而不是用户名使django注册用户

时间:2018-02-04 06:24:26

标签: python django python-3.x django-forms django-views

我正在尝试建立一个网站,用名字,姓氏,电子邮件和密码注册用户。我尝试过编写此表单并在视图中使用它

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class RegisterationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2',
        )

    def save(self, commit=True):
        user = super(RegisterationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        if commit:
            user.save()
        return user

并在视图中使用它

from django.shortcuts import render, redirect
from Users.forms import RegisterationForm
from django.contrib.auth import authenticate, login




def home(request):
    return render(request, 'Users/index.html')



def map_page(request):
    return render(request, 'Users/map_page.html')




def register (request):
    if request.method == 'POST':
        form = RegisterationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/map_page/')
    else:
        form = RegisterationForm()
        args = {'form': form}
        return render(request, 'Users/index.html', args)

然而,当我这样做的时候,我填写它,我得到一个错误 UNIQUE约束失败:auth_user.username

我想知道是否有办法不使用用户名并让他们注册并使用密码和电子邮件登录。

我尝试制作后端并将其包含在设置中并且无法正常工作。然后我也尝试使用自定义模型,并将其包含在admin.py中。我也把它包含在设置中,它给我带来了奇怪的错误。

如何以简单的方式向用户注册电子邮件而非用户名?

2 个答案:

答案 0 :(得分:4)

我认为最简单的解决方法是设置user.username = user.email

大多数情况下,此问题是由空用户名引起的,对第一个用户来说是可以的,但对于第二个用户来说是唯一的失败。

另一个选择是从用户模型中删除字段用户名。

https://docs.djangoproject.com/en/2.0/topics/auth/customizing/

class CustomUser(User): username = None

答案 1 :(得分:0)

您可以做的最好的事情是创建自己的用户并覆盖属性。 A已将此模板用于我的所有Django项目:

class CustomUser(AbstractUser):

    USERNAME_FIELD = 'email'

    def natural_key(self):
        return dict(email=self.email)

CustomUser._meta.get_field('email')._unique = True
CustomUser._meta.get_field('email')._blank = False
CustomUser._meta.get_field('username')._unique = False
CustomUser._meta.get_field('username')._blank = True
CustomUser._meta.get_field('username')._null = True

通过这种方式,您强制电子邮件成为唯一的用户名字段,并且您将用户名设置为可为空,空白且不唯一。