1

我正在尝试访问 Django 模板中用户模型的扩展字段,但它不起作用,有我的文件 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但没有显示我也尝试过访问 bio 字段user.bio是否有任何棘手的方法可以访问该字段?

4

1 回答 1

1

您将其设置related_name为:

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

但是 the是从对象related_name访问相关的名称(因此是反向关系的名称)。因此,您应该将其设置为(或将其留空),例如:AuthorUserauthor

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

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

于 2018-10-28T14:20:48.160 回答