我正在使用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__'
怎么了?
答案 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)