Django模板中的向后关系

时间:2015-10-19 05:17:14

标签: python django django-templates

我正在尝试在我的模板中显示来自不同模型的数据,但我不知道为什么它不能正常工作。

Models.py:

class Company(models.Model):
name = models.CharField(max_length=100)

class Location(models.Model):
company = models.ForeignKey('Company',
    related_name='locations')

Views.py:

def sth(request):
    loc_list = Location.objects.all()
    return render(request, 'blabla/index.html', {'loc_list': loc_list})

模板:

{% for loc in loc_list %}
    {% for entry in loc.company_set.all %}
        {{entry.name}}
    {% endfor %}
{% endfor %}

为什么公司名称没有显示?

3 个答案:

答案 0 :(得分:2)

你的外键关系是错误的方式...你当前定义它们的方式,Location只能有一个与Company相关联,但在你的模板中你试图获取Company的列表。

要使模板逻辑起作用,您的模型必须按如下方式定义:

class Company(models.Model):
    name = models.CharField(max_length=100)
    location = models.ForeignKey('Location')

class Location(models.Model):
    # You probably need some other fields in here.

然后这会起作用:

{% for loc in loc_list %}
    {% for entry in loc.company_set.all %}
        {{entry.name}}
    {% endfor %}
{% endfor %}

答案 1 :(得分:1)

仅使用" _set"访问后向关系时没有

loc.company_set.all 

因为每个地点只有一家公司(就像ForeignKey那样。你可以通过loc.company访问该地点的公司)。如果您希望位置拥有多家公司,请查看solarissmoke的答案(将ForeignKey属性放在公司而不是位置上),或使用ManyToManyField关系(这将允许公司拥有多个位置和每个位置到有多家公司)。

然后,您可以通过在模板中执行此操作来访问给定位置的所有公司:

{% for loc in loc_list %}
    {% for entry in loc.company.all %}
        {{entry.name}}
    {% endfor %}
{% endfor %}

您还可以使用related_name(company.locations)访问给定公司的所有位置。

答案 2 :(得分:1)

简短回答:

{% for loc in loc_list %}
     {{loc.company.name}}
{% endfor %}