首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:无法分配"< Profile : Profile对象(无)>“:"Profile.user”必须是"User“实例

Django:无法分配"< Profile : Profile对象(无)>“:"Profile.user”必须是"User“实例
EN

Stack Overflow用户
提问于 2018-06-19 12:59:27
回答 1查看 1.3K关注 0票数 1

我正在尝试使用Django创建一个注册表单。在提交表单时,我会收到这个错误。

这就是我所做的。

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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})

从错误跟踪中,我可以看到,错误是因为一次发送两个注册请求。不应该发生的因为我用过这个,

代码语言:javascript
复制
post_save.connect(updateUserProfile, dispatch_uid="app_models_updateUserProfile")

这是回溯,

错误跟踪#1

错误跟踪#2

我想我做了件傻事。请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 13:09:23

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

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

代码语言:javascript
复制
post_save.connect(updateUserProfile, sender=User, ...)

(不知道为什么指定了dispatch_uid;通常不需要这样做。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50929110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档