RelatedObjectDoesNotExist:用户没有用户配置文件

新手上路,请多包涵

所以我用字段 score 扩展了我的用户,如下所示:

模型.py:

 class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    score = models.IntegerField(default=0);

这似乎符合 推荐的方式

然后我尝试访问用户的 userprofile 在我看来:

意见.py:

 player = request.user.userprofile

这似乎也符合推荐的方式,但这就是我出错的地方:

 RelatedObjectDoesNotExist
User has no userprofile.

如果我将 userprofile 更改为其他内容,我会收到另一个错误:

 AttributeError
'User' object has no attribute 'flowerpot'

当我尝试以下代码时:

 print request.user
print UserProfile.objects.all()

我得到控制台输出:

 post_test1
[]

编辑

我有两个超级用户,七个我在扩展用户之前创建的用户,以及一个我在扩展用户之后创建的用户 (post_test1)。


编辑 2

很明显,我需要的是创建一个 post_save 处理程序,它在创建用户对象时创建一个新的配置文件。

当我阅读它时,这似乎很简单,转到链接到的 页面,这是 Django 发送的所有信号的列表。我抬头看了看 post_save 它说:

与 pre_save 类似,但在 save() 方法结束时发送。

好吧,所以我查找 pre_save 它说:

这是在模型的 save() 方法开始时发送的。

我是这样解释的:当我创建我的用户时(在我的 views.py 中)应该调用 save() 方法,直到现在和之后应该发送 post_save (?),这将在创建用户对象时创建一个新的配置文件!

所以现在我准备开始看例子了,所以我谷歌:

django post save example

在这里 看起来我应该添加一些看起来像装饰器的东西 @receiver(post_save, ...

在这里 看起来我应该更改多个文件并编写信号定义?

似乎也意味着多个文件(包括 signals.py

看起来比我最初想象的要多得多。这里的任何人都可以解释我是如何做到这一点的,或者向我展示一些关于信号如何工作的好资源吗?

现在我的 create_user 视图如下所示:

 def create_user(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password1"]
            new_user = User.objects.create_user(username=username, password=password)
            return redirect('play')
    else:
        form = UserCreationForm()

    return render(request, 'antonymapp/create_user.html', {'form': form})

我应该在返回之前致电 new_user.save() 吗?如果是,为什么直到现在它才有效?我在测试此视图时创建了一堆用户。它看起来也像这里附近的某个地方 post_save.connect(create_profile, sender=User) 应该添加?

原文由 MrJalapeno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 573
2 个回答

您必须首先为用户创建一个 userprofile

 profile = UserProfile.objects.create(user=request.user)

在你的 views.py 你可以使用 get_or_create 以便为用户创建 userprofile 如果用户没有。

 player, created = UserProfile.objects.get_or_create(user=request.user)

更新:要在每次创建新用户时自动创建用户配置文件,请使用信号。

myapp/signals.py 做这样的事情:

 @receiver(post_save, sender=User, dispatch_uid='save_new_user_profile')
def save_profile(sender, instance, created, **kwargs):
    user = instance
    if created:
        profile = UserProfile(user=user)
        profile.save()

原文由 v1k45 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您在尝试上述建议后仍收到此错误,则可能是因为您创建的第一个用户(使用 createsuperuser 命令)没有配置文件。

当我尝试使用该用户登录时出现此错误。我是这样解决的:

- 创建一个新用户。

-撤消更改。 (擦除您为配置文件编写的代码或将它们设为注释行)

- 登录到您的超级用户。

- 向新创建的用户授予管理员权限。

现在您可以删除第一个用户。 (没有个人资料的用户)

原文由 K.Yazoglu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题