当前位置: 代码迷 >> python >> Django模板中的向后关系
  详细解决方案

Django模板中的向后关系

热度:25   发布时间:2023-06-13 14:07:29.0

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

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 %}

为什么不显示公司名称?

您的外键关系是错误的方法...按照当前定义它们的方式,一个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 %}

访问后向关系时仅使用“ _set”。 没有

loc.company_set.all 

因为每个位置只有一个公司(这就是外键。您可以通过loc.company访问该位置的公司)。 如果您希望位置具有多个公司,请查看solarissmoke的答案(将ForeignKey属性放在Company而不是Location上),或使用ManyToManyField关系(这将允许公司具有多个位置,每个位置具有多个公司) 。

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

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

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

简短答案:

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