在模板中显示Django ForeignKey值

时间:2020-02-20 20:09:17

标签: python django

我正在尝试在模板中显示模型的ForeignKey值,所有其他字段显示都很好,但是我无法使其正常工作。这是我的代码:

models.py:

class BodyPart(models.Model):
    body_part = models.CharField(max_length=20, unique = True)

class Exercise(models.Model):
    body_part = models.ForeignKey(BodyPart, on_delete=models.CASCADE, default = "bodypart", related_name="bodypart")

views.py:

exercises = Exercise.objects.filter(category=exercisedetailcategory).values()
context = {
    "exercises" : exercises, 

}
return render(request,"exercises-categories.html",context)

模板:

{% for exercise in exercises %}
<span class="post-meta-category"><a href="">{{exercise.body_part}}</a></span>
      <div class="post-item-description">
        <a href="">{{exercise.title}}</a>

        <p>{{exercise.content}}</p>
{% endfor %}

2 个答案:

答案 0 :(得分:1)

这是您使用.values()的众多原因之一。如果传递Exercise模型,则可以将相关对象提取到内存中。您可以使用.select_related(..)来优化查询:

exercises = Exercise.objects.filter(
    category=exercisedetailcategory
).select_related('body_part')
context = {
    'exercises' : exercises, 

}
return render(request, 'exercises-categories.html', context)

然后在模板中,我们可以使用以下方式呈现该信息:

{% for exercise in exercises %}
<span class="post-meta-category"><a href="">{{ exercise.body_part.body_part }}</a></span>
      <div class="post-item-description">
        <a href="">{{ exercise.title }}</a>

        <p>{{ exercise.content }}</p>
{% endfor %}

您还可以为__str__实现BodyPart方法:

class BodyPart(models.Model):
    body_part = models.CharField(max_length=20, unique=True)

    def __str__(self):
        return self.body_part

,然后使用以下内容呈现:

{% for exercise in exercises %}
<span class="post-meta-category"><a href="">{{ exercise.body_part }}</a></span>
      <div class="post-item-description">
        <a href="">{{ exercise.title }}</a>

        <p>{{ exercise.content }}</p>
{% endfor %}

答案 1 :(得分:0)

在您的运动模型中,忽略默认部分。(可能显示任何告诉用户“ no body_part”的消息,例如 {%,如果不是exercise.body_part%}->无显示 并确保您在exercise.body_part中有一个值,这意味着您必须在BodyPart模型中有一个与此模型的当前对象相关的对象。

也应该是{{exercise.body_part.body_part}} 第二个是提取相关BodyPart对象的值