【问题标题】:Accessing fields defined in a OneToOneRelation in Django在 Django 中访问 OneToOneRelation 中定义的字段
【发布时间】:2018-01-28 01:08:17
【问题描述】:

我是 Django 新手,正在尝试访问自定义字段但没有任何运气。

Models.py

class UserProfile(models.Model):
user = models.OneToOneField(User)
bio = models.CharField(max_length=400)

def __str__(self):
    return self.user.username

forms.py

class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
bio = forms.CharField(widget=forms.Textarea(attrs={'cols':50, 'rows': 5}))

class Meta:
    model = User
    fields = ('username', 'email', 'password', 'bio')

views.py

def register(request):
registered = False
if request.method == "POST":
    user_form = UserForm(data=request.POST)
    if user_form.is_valid():
        user = user_form.save()
        user.set_password(user.password)
        user.save()
        registered = True
        login(request, user)
    else:
        print(user_form.errors)
else:
    user_form = UserForm
return render(request, 'accounts/register.html',
                    {'user_form':user_form, 'registered': registered})

@login_required
def current_user(request):
current = request.user
# profile = User.objects.get(username=current.username)
return render(request,'accounts/profile_detail.html',{"username":current.username,
                                                        "email":current.email,"id":current.id,
                                                        "bio":current.bio})

我正在尝试访问用户的简历。它一直说该领域不存在。我想要做的是访问 html 文件中的 bio:

{{ 简介 }}

不确定我在这里缺少什么。

【问题讨论】:

    标签: python django forms model


    【解决方案1】:

    您可以简单地执行{{ user.userprofile.bio }},因为user 将始终包含在模板内容中,并且用户将与UserProfile 有关系

    【讨论】:

    • bio 字段没有显示,我一直在查询它,但看起来它甚至没有添加 bio
    • 您是否添加了post_save() 信号来创建实际的profile 并保存它?我会推荐像这样的教程onethis
    【解决方案2】:

    问题是您试图从User 中获取bio 属性,而User 确实没有这样的属性。请记住:您在 UserProfile 类中定义了 bio

    Django 帮助您跨关系访问字段。它们被称为“相关领域”。在您的情况下,使用它应该足够了:

    bio = user.userprofile.bio
    

    或者从请求中使用用户:

    bio = request.user.userprofile.bio
    

    然后你可以将这个变量传递给上下文到render

    【讨论】:

    • 我好像没有添加用户配置文件。添加并保存后,它就像你说的那样工作。
    • 忘记运行迁移?
    • 不,我只是保存用户模型。我什至没有使用 UserProfile。一旦我在寄存器中创建了一个 UserProfile 并保存它,它就按预期工作了
    【解决方案3】:

    您可能需要使用{{ user.user.bio }},因为您有一个带有User 模型的OneToOneField。我不确定你是否可以直接从{{ user.bio }} 访问简历。

    【讨论】:

    • 你是对的,我编辑了我的答案。虽然我不确定{{ user.user }} 是否已定义
    • 是的,你是对的,你叫模型名称,在这种情况下是 user.userprofile,而不是 user.user,因为我建议 @LaurynasTamulevičius
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2015-01-26
    • 2013-07-02
    • 1970-01-01
    • 2011-08-19
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多