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)
如果即使您已尝试上述建议,您仍然收到此错误,则可能是由于您创建的第一个用户(使用 createsuperuser 命令)没有配置文件所致。
当我尝试使用该用户登录时,出现此错误。我是这样解决的:
- 创建一个新用户。
- 撤消更改。(擦除您为配置文件编写的代码或将其设为注释行)
- 登录到您的超级用户。
- 为新创建的用户授予管理员权限。
现在您可以删除第一个用户。(没有个人资料的用户)
归档时间: |
|
查看次数: |
12424 次 |
最近记录: |