【问题标题】:How to change username authentication to email authentication in already buit project?如何在已经构建的项目中将用户名身份验证更改为电子邮件身份验证?
【发布时间】:2017-06-16 20:00:05
【问题描述】:

我最初使用用户名和密码登录,但现在想将其更改为同一站点中的电子邮件地址身份验证,而无需删除现有用户和内容。 我在文件中进行了以下更改,但收到错误“唯一约束失败:auth_user.username”

forms.py

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


class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 'password']

views.py

class UserFormView(View):

    form_class = UserForm
    template_name = 'main/registration_form.html'

    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():

            user = form.save(commit=False)

            # cleaned (normalized) data
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            user.set_password(password)
            user.save()

            # return user objects if credentials are correct
            user = authenticate(email=email, password=password)

            if user is not None:

                if user.is_active:
                    login(request, user)
                    # request.user.username       display their username
                    return redirect('main:register2')
        return render(request, self.template_name, {'form': form})

class LoginForm(View):

    form_class = UserForm
    template_name = 'main/login_form.html'

    def get(self, request):
        form = self.form_class(None)
        if error:
            return render(request, self.template_name, {'form': form}, 
{'error': error})
        else:
            return render(request, self.template_name, {'form': form})

    def post(self, request):
        email = request.POST.get('email', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(email=email, password=password)

        if user is not None and user.is_active:
            # Correct password, and the user is marked "active"
            auth.login(request, user)
            # Redirect to a success page.
            return HttpResponseRedirect("/main/home/")
        else:
            # Show an error page
            error = True
            return HttpResponseRedirect("/main/", {'error': error})

我得到的错误 - http://dpaste.com/0ZVHW0P

考虑到我是 django 的新手,请回答。 提前谢谢你:)

【问题讨论】:

    标签: python django authentication django-forms django-rest-framework


    【解决方案1】:

    因此,即使您想使用电子邮件地址作为标识符,如果您想“开箱即用”地使用 Django 的身份验证框架,您仍然必须使用身份验证表中的username 字段。

    上面发生的情况是您没有设置用户名,这意味着您的auth_user 表中有空的用户名。由于用户名必须是唯一的,当您尝试添加第二个没有用户名的用户时,您将获得数据库级别的完整性约束UNIQUE constraint failed: auth_user.username

    要解决此问题,请将您的 views.py 更改为如下所示:

    class UserFormView(View):
    
        form_class = UserForm
        template_name = 'main/registration_form.html'
    
        def get(self, request):
            form = self.form_class(None)
            return render(request, self.template_name, {'form': form})
    
        def post(self, request):
            form = self.form_class(request.POST)
    
            if form.is_valid():
    
                user = form.save(commit=False)
    
                # cleaned (normalized) data
                email = form.cleaned_data['email']
                password = form.cleaned_data['password']
                user.username = email
                user.set_password(password)
                user.save()
    
                # return user objects if credentials are correct
                user = authenticate(username=email, password=password)
    
                if user is not None:
    
                    if user.is_active:
                        login(request, user)
                        # request.user.username       display their username
                        return redirect('main:register2')
            return render(request, self.template_name, {'form': form})
    
    class LoginForm(View):
    
        form_class = UserForm
        template_name = 'main/login_form.html'
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多