如何在Django模板中访问扩展的用户属性

时间:2018-10-28 14:18:28

标签: django templates

我正在尝试访问Django模板中User模型的扩展字段,但是它不起作用,有我的文件: models.py

class Author(models.Model):
    user = models.OneToOneField(User, related_name='user', on_delete=models.SET_NULL, null=True)
    bio = models.TextField(
        max_length=1400, help_text="Enter author biography.")

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

    def create_profile(sender, **kwargs):
        user = kwargs["instance"]
        if kwargs["created"]:
            user_profile = Author(user=user, bio='my bio')
            user_profile.save()
    post_save.connect(create_profile, sender=User)

模板:

{% extends "base_generic.html" %}
{% block title %}
<title>Author {{user}}</title>
{% endblock %}
{% block content %}
  <h1>{{user}}</h1>
  <h2>Bio:</h2>
  <p>{{user.author.bio}}</p>
  <div>
    {%for item in user.author.blogs_set.all%}
    <p>{{item.title}}</p>
    <hr> 
    {%endfor%}
  </div>

{% endblock %}

观看次数:

class UserDetailView(generic.DetailView):
    model = User
    template_name = 'blogapp/user_detail.html'

我想通过user.author.bio来访问生物领域,但我也没有尝试过user.bio的任何显示,是否有任何棘手的方法来访问该领域?

1 个答案:

答案 0 :(得分:1)

您将related_name设置为:

class Author(models.Model):
    user = models.OneToOneField(
        User,
        related_name='user',
        on_delete=models.SET_NULL, null=True
    )

但是related_name是从Author对象访问相关User的名称(因此,在 reverse < / strong>)。因此,您应将其设置为author(或将其留空),例如:

class Author(models.Model):
    user = models.OneToOneField(
        User,
        related_name='author',
        on_delete=models.SET_NULL, null=True
    )

通过将其设置为user,您可以使用Author访问user.user对象,但是我强烈建议不要这样做,因为在最后,它只会导致难以理解的代码。对于Django,这当然没关系(假设没有两个源自User的关系具有相同的名称),但是对于程序员来说,这给人的印象是错误的。