我正在尝试访问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
的任何显示,是否有任何棘手的方法来访问该领域?
答案 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
的关系具有相同的名称),但是对于程序员来说,这给人的印象是错误的。