用户没有userprofile

MrJ*_*eno 8 python django django-authentication

所以我用这样的字段扩展了我的用户score:

models.py:

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

这似乎与推荐的方式一致

然后我尝试在我的视图中访问用户userprofile:

views.py:

player = request.user.userprofile
Run Code Online (Sandbox Code Playgroud)

这也似乎与推荐的方式一致.但那是我收到错误的地方:

RelatedObjectDoesNotExist
User has no userprofile.
Run Code Online (Sandbox Code Playgroud)

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

AttributeError
'User' object has no attribute 'flowerpot'
Run Code Online (Sandbox Code Playgroud)

当我尝试以下代码时:

print request.user
print UserProfile.objects.all()
Run Code Online (Sandbox Code Playgroud)

我得到控制台输出:

post_test1
[]
Run Code Online (Sandbox Code Playgroud)

编辑
我有两个超级用户,
我在扩展用户之前创建了七个用户,在扩展用户之后创建了
一个用户(post_test1).


EDIT_2

你好,我们又见面了!

因此它清楚地表明我需要的是

创建一个post_save处理程序,在创建User对象时创建一个新的配置文件

当我阅读它时,这似乎很简单,转到链接到的页面,其中列出了Django发送的所有信号.我查了一下post_save,它说:

像pre_save一样,但是在save()方法结束时发送.

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

这是在模型的save()方法的开头发送的.

我的解释是这样的:当我创建我的用户(在我的views.py中)时,应该调用save()方法(到目前为止还没有这种情况),之后应该发送post_save(? )当创建User对象时,它将创建一个新的配置文件!

所以现在我已经准备好开始查看示例,所以我谷歌:
userprofile
这里看起来我应该添加看起来像装饰器的东西userprofile
这里看起来我应该改变多个文件并写一个信号定义?
这个似乎也意味着多个文件(包括signals.py)

它看起来还有更多,然后我第一次想到.这里的任何人都可以解释我是如何做到的,或者向我展示一些关于信号如何工作的好资源?

现在我的create_users视图看起来像这样:

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})
Run Code Online (Sandbox Code Playgroud)

我应该在返回之前调用new_user.save()吗?如果是的话,为什么它一直运作到现在为止?我在测试此视图时创建了一堆用户.它看起来也post_save应该添加在这附近?我显然很迷失在这里......

v1k*_*k45 12

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

profile = UserProfile.objects.create(user=request.user)
Run Code Online (Sandbox Code Playgroud)

在views.py中,您可以使用,get_or_create以便在用户没有用户配置文件时为其创建用户配置文件.

player, created = UserProfile.objects.get_or_create(user=request.user)
Run Code Online (Sandbox Code Playgroud)

更新:为了在每次创建新用户时自动创建用户配置文件,请使用singals.在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()
Run Code Online (Sandbox Code Playgroud)


K.Y*_*glu 6

如果即使您已尝试上述建议,您仍然收到此错误,则可能是由于您创建的第一个用户(使用 createsuperuser 命令)没有配置文件所致。

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

- 创建一个新用户。

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

- 登录到您的超级用户。

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

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