Django:无法分配“ <profile:profile =”“ object =”“(无)=”“>”:“ Profile.user”必须是“ User”实例

时间:2018-06-19 12:59:27

标签: python django

我正在尝试使用Django创建注册表单。提交表单时出现此错误。

这就是我所做的。

models.py

from django.db import models 
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    profile_ID  = models.IntegerField(primary_key=True)
    user        = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar      = models.ImageField(upload_to='img/',     default='img/none/default-avatar.png')

def updateUserProfile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

post_save.connect(updateUserProfile, dispatch_uid="app_models_updateUserProfile")    

views.py

from django.shortcuts import render, redirect
from django.views import View
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import UserCreationForm
from .models import Profile
# Create your views here.

class SignUpView(View):
    templateName = 'auth/signup.html'

    def get(self, request, *arg, **kwargs):
        form = UserCreationForm()
        return render(request, self.templateName, {'form': form})

    def post(self, request, *arg, **kwargs):
        form = UserCreationForm(request.POST, request.user)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('/')
        return render(request, self.templateName, {'form': form})

从错误回溯中,我可以看到该错误是由于一次以某种方式发送两个注册请求的事实造成的。 因为我已经用过,所以不应该发生,

post_save.connect(updateUserProfile, dispatch_uid="app_models_updateUserProfile")

这是追溯,

Error traceback #1

Error traceback #2

我想我做了一些愚蠢的事情。请帮忙!

1 个答案:

答案 0 :(得分:1)

您已将信号处理程序连接到所有后保存信号。因此,当您调用instance.profile.save()时,它会再次在配置文件本身上被调用,然后它会尝试将其分配为另一个新创建的配置文件中的用户属性。

您应该将其限制为仅在用户保存后调用:

post_save.connect(updateUserProfile, sender=User, ...)

(不确定为什么指定了dispatch_uid;通常不需要。)