无法分配“((<User:jack>,True)”“ Profile.user”必须是“ User”实例

时间:2019-08-01 18:28:46

标签: django

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

2 个答案:

答案 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})