Django模板中的外键关系

时间:2014-12-23 03:48:37

标签: python django django-templates django-views foreign-key-relationship

我知道很多次都会问这个问题,但我仍然无法解决。

model.py

class Awb (models.Model):
    awb_id = models.CharField(primary_key=True, max_length=50)
    awb_shipment_date = models.DateTimeField()
    awb_shipper = models.CharField(max_length=250)
    awb_sender_contact = models.CharField(max_length= 50)

class History (models.Model):
    history_id = models.AutoField(primary_key=True)
    awb = models.ForeignKey(Awb)
    history_city_hub = models.CharField(max_length=250)
    history_name_receiver = models.CharField(max_length=250)

view.py

def awb_list_view(request):
    data = {}
    data['awb'] = Awb.objects.all()
    data['history'] = History.objects.all()
    return render(request, 'portal/awb-list.html', data)

模板

{% for s in awb.history_set.all %}
    {{ s.awb_id }}
    {{ s.history_id }}
{% endfor %}

当我尝试使用此代码时,模板中没有结果。我想在模板中显示awb_id和history_id。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

首先让我们看一下视图代码......

def awb_list_view(request):
    data = {}
    data['awb'] = Awb.objects.all()
    data['history'] = History.objects.all()
    return render(request, 'portal/awb-list.html', data)

传递给模板的上下文字典包含一个带有键&aw;'的项目。和各自的QuerySet Awb.objects.all()

现在让我们看看模板for loop ...

{% for s in awb.history_set.all %}

此循环模板标记的开头正在尝试生成一组反向历史对象。为了实现这一点,我们需要一个AWB对象实例。相反,' awb' variable是一个QuerySet,它作为上下文传递给模板。

如果此代码的目标是显示所有AWB对象及其相关的History对象,则以下模板代码应该有效。

{% for awb_obj in awb %}
    {% for history_obj in awb_obj.history_set.all %}
        {{ awb_obj.id }}
        {{ history_obj.id }}
    {% endfor %}
{% endfor %}

答案 1 :(得分:0)

Awb.history_set.all仅适用于一个Awb对象,而不适用于查询集。

这样可行:

data['awb'] = Awb.objects.first()  # If the first one has history

或:

遍历模板中的所有Awb对象,以访问每个对象的history_set。

{% for a in awb %}
    awb: {{ a.awb_id }}<br>
    {% for h in a.history_set.all %}
        history: {{ h.history_id }}<br>
    {% endfor %}
{% endfor %}