当前位置: 首页 > 面试题库 >

RelatedObjectDoesNotExist:用户没有用户个人资料

厉成仁
2023-03-14
问题内容

因此,我将用户扩展到了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对象时创建一个新的配置文件。

当我阅读它时,这似乎很简单,转到链接到的页面,该页面列出了Django发送的所有信号。我抬起头post_save说:

类似于pre_save,但在save()方法的末尾发送。

好吧,所以我抬起头pre_save,它说:

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

我这样解释:在创建用户时(应在views.py),save()应调用方法,直到现在还没有这种情况,然后post_save应发送a(?),这将创建一个新方法。配置文件,只要创建了User对象!

所以现在我准备开始看例子了,所以我在谷歌上:

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)应该在此处附近添加?


问题答案:

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

profile = UserProfile.objects.create(user=request.user)

在您的views.py中,您可以使用,get_or_create以便为该用户创建一个用户配置文件(如果该用户没有)。

player, created = UserProfile.objects.get_or_create(user=request.user)

更新 :为了在每次创建新用户时自动创建用户配置文件,请使用单个字符。在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()


 类似资料:
  • 问题内容: 在将其他字段(例如位置,性别,雇主等)添加到用户个人资料时,是否应该在其中添加其他列并将其保存在其中?还是应该创建一个新表来保存用户个人资料信息? 另外,当用户上传个人资料图片时,是否应该将其保存在同一张表中?(请注意,这不是生产服务器,我只是在本地运行服务器上执行此操作以弄清楚问题)。谢谢 问题答案: 你必须为用户个人资料建立模型: 然后在中配置

  • 问题内容: 你好,我是python和django的新手,我需要一个获取当前用户配置文件的视图,我知道我应该使用User的get_profile,但我不知道如何使用它。我读了django文件,但并没有帮助我。这是我从doc中找到的: 问题答案: Django的文档说明了一切,尤其是存储有关用户的其他信息的部分。首先,您需要在字段中的某个位置定义一个模型,以获取用户的其他信息: models.py 然

  • 问题内容: 我正在使用Java中的Twitter4J API来检索已登录的Twitter用户的个人资料图像。该命令类似于: 图片大小是多少?例如,如何在标签中显示对象? 问题答案: 好的,答案是: 假设Twitter对象是twitter 1-从twitter对象获取用户 2-获取个人资料图片网址 3-创建图像图标 4-将JLabel图标设置为ImageIcon

  • 问题内容: 在过去的两天里,我一直在尝试找到一种使用其他配置文件启动Chrome的方法,但无济于事。不管我做什么,Selenium为chrome加载的配置文件始终是一些临时配置文件,例如“ C:\ Users \ DARKBO〜1 \ AppData \ Local \ Temp \ scoped_dir14308_25046 \ Default” 我尝试了以下代码: 首先,我尝试直接从Chrom

  • 问题内容: 我正在使用来存储一些其他的每用户信息AUTH_PROFILE_MODULE。 我们可以使用Django模板访问用户,但是由于只能通过函数访问配置文件,因此如何访问配置文件中的字段? 确实需要每次将配置文件显式传递到模板中吗? 问题答案: 使用。Django的模板语言会自动调用可调用的东西-在这种情况下为法。

  • 问题内容: 我正在尝试重定向刚刚登录到他/她各自帐户页面的用户。 这个问题已经被问过几次了,但是其中大多数是古老的,并且使用静态网址,例如:Django- 登录后,将用户重定向到他的自定义页面-> mysite.com/username 。我想使用动态网址命名来实现此解决方案。 例如,如果我的帐户目标网页具有以下网址格式,该怎么办? 我怎么会通过ARGS中的? 问题答案: 这是不可能的使用动态参数

  • 我在Google BigQuery中创建了一个数据集,并下载了json auth文件。我试图从Jupyter笔记本中的python访问此数据集中的表,但我得到了错误: “禁止:403补丁https://bigquery.googleapis.com/bigquery/v2/projects/testdbt-bigquery-20200403/datasets/landing_zone_flight

  • 当我试图创建一个帖子时,它会显示这个错误 而我的 view.py 是 追溯: 文件"/home/zola/lib/python3.5/site-pack/django/core/handler/exception.py"在内部39.响应=get_response(请求) 文件“/home/zola/lib/python3.5/site-packages/django/core/handlers/b