所以我已经通过以下方式将用户扩展了字段score
:
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
score = models.IntegerField(default=0);
这似乎是沿用推荐的方法。
接下来,我尝试在我的视图中访问用户的userprofile
:
views.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
处理程序,在每次创建User对象时都创建一个新的profile。
当我阅读它时,它似乎很简单,我转到链接的页面,那里是Django发送的所有信号的列表。 我查找了post_save
,它说:
像pre_save一样,但在save()方法结束时发送。
好的,所以我查找了pre_save
,它说:
这是在模型的save()方法开始时发送的。
我这样解释它:当我创建我的用户(在我的views.py
中)时,应该调用save()
方法,但直到现在还没有发生过,并且之后应该发送post_save
,每当创建User对象时都会创建一个新的profile!
所以现在我准备开始查看示例,于是我谷歌搜索:
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)
?
RelatedObjectDoesNotExist
表示没有与request.user
相关联的userprofile
,这似乎很明显,不是吗? - Shang WangAUTH_PROFILE_MODULE = 'base.UserProfile'
- abhishekgarg