i对用户模型(配置文件)使用一对一链接 当我尝试进行用户注册时出现此错误 无法分配“(,True)”:“ Profile.user”必须是“ User”实例。 这是user_registration在我的项目中使用的 谢谢你的帮助
def user_registration(request):
form = UserRegistrationForm()
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
structure= form.cleaned_data['structure'].id
user = User.objects.get_or_create(username=username, password=password)
profile=Profile.objects.create(structure_id=structure,user=user)
profile.save()
messages.success(request,
'Enregistrement avec succés {}'.format(user.username))
return HttpResponseRedirect(reverse('compte:login'))
else:
form = UserRegistrationForm()
return render(request,'compte/register.html',{'form':form})
这是我的回溯:
[2019年8月1日22:01:13]“ GET / compte / register / HTTP / 1.1” 200 2194 [01 / Aug / 2019 22:01:16]“ GET /static/js/popper.min.js HTTP / 1.1” 404 1773 [01 / Aug / 2019 22:01:16]“ GET /static/js/jquery-3.3.1.slim.min.js HTTP / 1.1” 404 1806 [01 / Aug / 2019 22:01:16]“ GET /static/js/bootstrap.min.js HTTP / 1.1” 404 1782 [01 / Aug / 2019 22:01:16]“ GET / compte / register / HTTP / 1.1” 200 2194 [01 / Aug / 2019 22:01:16]“ GET /static/js/jquery-3.3.1.slim.min.js HTTP / 1.1” 404 1806 [01 / Aug / 2019 22:01:16]“ GET /static/js/popper.min.js HTTP / 1.1” 404 1773 [01 / Aug / 2019 22:01:16]“ GET /static/js/bootstrap.min.js HTTP / 1.1” 404 1782 内部服务器错误:/ compte / register / 追溯(最近一次通话): 内部文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py”,第34行 响应= get_response(请求) 文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py”,行_get_response中的115 响应= self.process_exception_by_middleware(e,请求) _get_response中的文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py”,第113行 响应= wraped_callback(请求,* callback_args,** callback_kwargs) 在user_registration中的文件“ /Users/mac/Desktop/investissement/Invest_App/compte/views.py”,第38行 profile = Profile.objects.create(structure_id =结构,用户=用户) 文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/manager.py”,第82行,在manager_method中 返回getattr(self.get_queryset(),name)(* args,** kwargs) 在创建时,文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/query.py”,第420行 obj = self.model(** kwargs) init 中的文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/base.py”,第483行 _setattr(自己,field.name,rel_obj) 文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py”,第301行,位于设置中 super()。设置(实例,值) set 中的文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py”,第211行 self.field.remote_field.model._meta.object_name, ValueError:无法分配“(,True)”:“ Profile.user”必须是“ User”实例。 [01 / Aug / 2019 22:01:25]“ POST / compte / register / HTTP / 1.1” 500 91942
答案 0 :(得分:1)
get_or_create
返回该项目的元组和一个布尔值,指示是否已创建。您应该同时捕获:
user, created = User.objects.get_or_create(username=username, password=password)
profile = Profile.objects.create(structure_id=structure,user=user)
但是,您也不应该这样做。这样,您可以确保密码没有散列;并且在任何情况下,username
都是唯一字段,因此如果用户名已经存在,则该表单将无效。
直接调用form.save:
user = form.save()
另外请注意,您无需调用profile.save()
,因为create
会保存项目本身。
答案 1 :(得分:0)
.get_or_create(..)
[Django-doc]将返回一个2元组,其中第一个是对象生成的,第二个是bool
ean,用于指定是否创建了新对象。因此,您可以在此处使用可迭代的解压缩,以访问第一个元素。
def user_registration(request):
form = UserRegistrationForm()
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
structure = form.cleaned_data['structure'].id
user, __ = User.objects.get_or_create(username=username, password=password)
profile = Profile.objects.create(structure_id=structure,user=user)
profile.save()
messages.success(request, 'Enregistrement avec succés {}'.format(user.username))
return HttpResponseRedirect(reverse('compte:login'))
else:
form = UserRegistrationForm()
return render(request,'compte/register.html',{'form':form})
话虽如此,上述操作将无效,因为密码未不会作为原始文本保存在数据库中,而是经过哈希处理。您将需要使用.set_password(..)
[Django-doc]设置密码。您可能希望对Profile
使用.update_or_create(..)
[Django-doc],以防止在该用户的配置文件已存在的情况下出错:
def user_registration(request):
form = UserRegistrationForm()
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
structure = form.cleaned_data['structure'].id
user, __ = User.objects.get_or_create(username=username)
user.set_password(password)
user.save()
Profile.objects.update_or_create(
user=user,
defaults={'structure_id': structure}
)
messages.success(request, 'Enregistrement avec succés {}'.format(user.username))
return redirect('compte:login')
else:
form = UserRegistrationForm()
return render(request,'compte/register.html',{'form':form})