【发布时间】:2016-07-18 23:41:09
【问题描述】:
所以我使用score 字段扩展了我的用户,如下所示:
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
score = models.IntegerField(default=0);
这似乎与recommended way 类似。
然后我尝试在我的视图中访问用户的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 处理程序,该处理程序在创建用户对象时创建一个新的配置文件。
当我阅读它时,这似乎很简单,转到链接到的page,它是 Django 发送的所有信号的列表。我查了一下post_save,它说:
类似于 pre_save,但在 save() 方法结束时发送。
好的,所以我查了一下pre_save,它说:
这是在模型的 save() 方法开始时发送的。
我是这样解释的:当我创建用户时(在我的views.py 中),应该调用save() 方法,直到现在还没有这种情况,然后是post_save应该发送(?),这将在创建用户对象时创建一个新的配置文件!
所以现在我准备开始查看示例,所以我谷歌:
django post save example
Here 看起来我应该添加一些看起来像装饰器的东西@receiver(post_save, ...
Here 看起来我应该更改多个文件并编写一个信号定义?
This one 似乎也暗示了多个文件(包括一个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表示没有与userprofile相关的request.user,这很明显,不是吗? -
我使用用户配置文件扩展了用户,但仍然没有与请求用户相关的用户配置文件。所以,是的,你是对的。这显然是我在这里要问的问题。
-
您是否在设置文件中设置了用户配置文件?例如,如果您的应用名称是基础名称,那么您需要将其添加到您的设置文件中。
AUTH_PROFILE_MODULE = 'base.UserProfile'
标签: python django django-authentication