所以我用字段 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 许可协议
您必须首先为用户创建一个
userprofile
:在你的
views.py
你可以使用get_or_create
以便为用户创建userprofile
如果用户没有。更新:要在每次创建新用户时自动创建用户配置文件,请使用信号。
在
myapp/signals.py
做这样的事情: