如何在模板中引用用户外键?

时间:2016-12-26 02:24:48

标签: django django-models

我似乎无法很好地掌握这一点。所以我有一个Album模型,它使用基于类的视图,我给它带有所有对象的上下文:

class Album(models.Model):
    # Columns
    artist = models.CharField(max_length=50)
    album_title = models.CharField(max_length=200)
    genre = models.CharField(max_length=100)
    album_logo = models.FileField()
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)

默认设置是为了查看它是否在管理页面中工作。在每个Album对象上都有一个用户字段,但是当我尝试在模板上显示它时,它没有显示。

{% for album in all_albums %}
<h2>{{ album.album_title }}</h2>
<h4>{{ album.artist }}</h4>
<h6 class="text-muted">Created by: {{ album.user }}</h6>
{% endfor %}

album_title和artist显示得很好,但不是User(str是用户名)。当我尝试在shell上获取它时,我得到了这个:

django.contrib.auth.models.DoesNotExist: User matching query does not exist.

编辑: 我刚注意到这一点。在模板标签上我这样做:

<h6 class="text-muted">Created by: {{ album.user_id }}</h6>

它确实显示与该个人相册对应的用户ID。但是没有用户名或电子邮件的方法等。

2 个答案:

答案 0 :(得分:2)

错误说:

django.contrib.auth.models.DoesNotExist: User matching query does not exist.

显然,存储在相册表的外键列中的用户ID在用户表中不存在。最好没有死的外键关系,那么你就不会有这些错误。

然而,有时可能仍会发生。你可以像这样保护自己:

try:
    user = album.user
except DoesNotExist:
    user = None

在模板中,您遗憾的是无法执行此操作。所以你必须在python中完成它并在模板上下文中传递它,或者你可以创建一个custom template tag,你可以把这些尝试除了行。

答案 1 :(得分:1)

那么你好。

让我们从您提供给我们的信息中查看这个问题。

您正尝试在模板中引用模型并访问该模型的外键值。

例如

record = Example.objects.get()
# pass into context
context = {"record": record}
#
# now we access in template
{{ record.user.username }}

确保您获得记录。 “DoesNotExist”似乎表示您没有正确查询,或者您搜索的记录不正确,请检查用户名和密码以及身份验证设置。

确保将其传递给模板的上下文,因此“记录”。您可以通过{{record.user(object)}}访问外交关系 {{record.user.username(例如,用户名,电子邮件等)}}