使用电子邮件作为用户名字段的自定义用户模型的登录用户

时间:2019-12-08 17:27:48

标签: python django authentication django-models django-login

我正在使用Python(3.7)和Django(2.2)开发一个项目,在其中我通过扩展pattern <- "\\d{1,}" # matches numbers with at least one numeric character 实现了自定义用户模型,现在我需要让用户登录到该站点。

这是我到目前为止尝试过的。

来自AbstractBaseUser

models.py

来自class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(max_length=254, unique=True) password = models.CharField(max_length=100) # name = models.CharField(max_length=254, null=True, blank=True) title = models.CharField(max_length=255, blank=False) user_type = models.CharField(max_length=255, blank=False) gender = models.CharField(max_length=255, choices=CHOICES, blank=False) contenst = models.TextField(max_length=500, blank=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) is_active = models.BooleanField(default=True) last_login = models.DateTimeField(null=True, blank=True) date_joined = models.DateTimeField(auto_now_add=True) USERNAME_FIELD = 'email' EMAIL_FIELD = 'email' REQUIRED_FIELDS = ['password'] objects = UserManager()

urls.py

来自path('login', views.UserLogin.as_view(), name='login'),

views.py

来自class UserLogin(generic.View): def get(self, request, *ars, **kwargs): return render(request, 'users/login.html', {'form': LoginForm}) def post(self, request, *args, **kwargs): form = LoginForm(request.POST) if form.is_valid(): email = form.cleaned_data['email'] password = form.cleaned_data['password'] user = authenticate(request, email=email, password=password) if user is not None: login(request, user) return HttpResponseRedirect(reverse_lazy('home')) else: return 'Something wrong'

forms.py

当我尝试登录用户时,显示错误消息:

  

异常值:'str'对象没有属性'get'

     

更新:完全追溯:

class LoginForm(forms.Form):
    email = forms.EmailField()
    password = forms.PasswordInput()

    class Meta:
        fields = '__all__'

怎么了?

2 个答案:

答案 0 :(得分:1)

这是因为您的表单出于某种原因无效,请尝试使用类似的方法来调试错误:

if form.is_valid():
    ****   
else:
    print(form.errors)  # To see the form errors in the console. 

答案 1 :(得分:1)

这里有几个问题:

首先,您要从post方法返回 raw 字符串;您可以使用以下方法解决此问题:

return HttpResponse('Something wrong')

接下来,您在Meta中包含了LoginForm类,如果您使用的是forms.Form,则不需要。

最后,对于password中的LoginForm字段,您正在使用PasswordInput,它是 widget (不是表单控件);您可以使用以下方法解决此问题:

password = forms.CharField(strip=False, widget=forms.PasswordInput)