Django ';用户';对象没有属性';后端';
编辑:如果您想跳过背景故事,只需检查错误消息和代码转储,所有内容都在底部:)Django ';用户';对象没有属性';后端';,django,forms,Django,Forms,编辑:如果您想跳过背景故事,只需检查错误消息和代码转储,所有内容都在底部:) 我已经尝试实施了半天的用户注册表,我觉得我已经很接近了,但还没有完全实现 因此,我首先实现了Django的内置UserCreationForm。根据我的观点,我设计了这段代码,灵感来源于对以下内容的回应: 从django.contrib.auth.forms导入UserCreationForm 从django.contrib.auth导入登录 def创建用户(请求): 如果request.method==“POST”
我已经尝试实施了半天的用户注册表,我觉得我已经很接近了,但还没有完全实现 因此,我首先实现了Django的内置
UserCreationForm
。根据我的观点,我设计了这段代码,灵感来源于对以下内容的回应:
从django.contrib.auth.forms导入UserCreationForm
从django.contrib.auth导入登录
def创建用户(请求):
如果request.method==“POST”:
form=UserCreationForm(request.POST)
如果form.is_有效():
new_user=user.objects.create_user(**form.cleaned_data)
登录(新用户)
返回重定向(“post_列表”)
其他:
form=UserCreationForm()
返回呈现(请求'blog/create_user.html',{'form':form})
问题是:我希望用户也能够存储他们的电子邮件。因此,我决定使用其中的一段代码来扩展forms.py
文件中的UserCreationForm()
:
来自django导入表单的
从django.contrib.auth.models导入用户
从django.contrib.auth.forms导入UserCreationForm
类UserCreateForm(UserCreationForm):
email=forms.EmailField(必需=True)
类元:
模型=用户
字段=(“用户名”、“电子邮件”、“密码1”、“密码2”)
def save(self,commit=True):
user=super(UserCreateForm,self).save(commit=False)
user.email=self.cleanned_数据[“email”]
如果提交:
user.save()
返回用户
当我检查实际的网页时,它仍然拒绝包含电子邮件部分(即使在我关闭后:从django.contrib.auth.forms导入UserCreationForm
到从.forms导入UserCreationForm
)。最后,我在views.py
和forms.py
文件中将forms.py文件中的名称切换为UserForm。因此,在forms.py
文件中,它现在说:
类用户表单(UserCreationForm):
解决方案的灵感来源于此
所以现在它说,“password1”是这个函数的无效关键字参数
,我想“当然,我正在将一本字典从我的表单传递到create_user,现在我已经篡改了UserCreationForm
它的运行不再那么顺利了:create_user想要用户名、电子邮件和密码,对吗?但现在我正在发送用户名、电子邮件、密码1和密码2
因此,我在views.py
中的代码中添加了以下内容:
如果form.is_有效():
用户名=表单。已清理的\u数据[“用户名”]
电子邮件=表单。已清理的数据[“电子邮件”]
password=表单。已清除的\u数据[“password1”]
新建用户=用户。对象。创建用户(用户名、电子邮件、密码)
登录(新用户)
现在我在/create_user/:login()上得到了TypeError,它正好有两个参数(1个给定)
,而真正让我头疼的是,在我篡改UserCreationForm
之前,这不是一个问题。但是,好吧,好吧,我会用谷歌搜索它,阅读文档和一些示例,看起来大多数人使用login(request,user)
调用登录函数,所以我再次将代码更改为:
new_user=user.objects.create_user(用户名、电子邮件、密码)
登录(请求,新用户)
在这里,我终于陷入了僵局:
'User' object has no attribute 'backend'
我用谷歌搜索它,要么我找不到任何与我的处境相关的东西,要么我迟钝地去看它。如果有人能解释出问题所在,我将不胜感激
当前代码的代码转储:为了可读性,省略了其他视图和不相关的导入 views.py
从django.exe导入渲染
from.forms导入用户表单
从django.shortcuts导入重定向
从django.contrib.auth.models导入用户
从django.contrib.auth导入登录
def创建用户(请求):
如果request.method==“POST”:
form=UserForm(request.POST)
如果form.is_有效():
用户名=表单。已清理的\u数据[“用户名”]
电子邮件=表单。已清理的数据[“电子邮件”]
password=表单。已清除的\u数据[“password1”]
新建用户=用户。对象。创建用户(用户名、电子邮件、密码)
登录(新用户)
返回重定向(“post_列表”)
其他:
form=UserForm()
返回呈现(请求'blog/create_user.html',{'form':form})
forms.py
来自django导入表单的
从django.contrib.auth.models导入用户
从django.contrib.auth.forms导入UserCreationForm
类UserForm(UserCreationForm):
email=forms.EmailField(必需=True)
类元:
模型=用户
字段=(“用户名”、“电子邮件”、“密码1”、“密码2”)
def save(self,commit=True):
user=super(UserForm,self).save(commit=False)
user.email=self.cleanned_数据[“email”]
如果提交:
user.save()
返回用户
来自:
首先调用authenticate()
手动登录用户时,必须成功
在调用login()之前,使用authenticate()对用户进行身份验证。
authenticate()为用户设置一个属性,指出
身份验证后端已成功对该用户进行身份验证(请参阅
后端文档(了解详细信息),并且需要此信息
稍后在登录过程中。如果您尝试执行此操作,将引发错误
登录直接从数据库检索的用户对象
因此,为了登录用户,您必须首先调用authenticate()
并检查是否返回了用户:
new_user = User.objects.create_user(username, email, password)
new_user = authenticate(username=username, password=password)
if new_user:
login(request, new_user)
从:
首先调用authenticate()
手动登录用户时,必须成功
使用authenticat对用户进行身份验证
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
def create_user(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = User.objects.create_user(**form.cleaned_data)
new_user = authenticate(**form.cleaned_data)
login(request, new_user)
return redirect('post_list')
else:
form = UserCreationForm()
return render(request, 'blog/create_user.html', {'form': form})