【问题标题】:Django template using _set.all使用 _set.all 的 Django 模板
【发布时间】:2013-02-24 08:53:29
【问题描述】:

我正在开发一个用于跟踪光纤电缆的 Django 应用程序。我遇到了我认为是相关管理器的问题,因为在某些模板中我可以让它做我想做的事,但在其他模板中我不能。

我正在尝试做的一个工作示例:

<ul>
    {% for lanroom in building.lanroom_set.all %}
    <li><a href="/lanrooms/{{ lanroom.id }}/">{{ lanroom.lan_room_name }}</a></li>
    {% endfor %}
</ul>

这样做的目的是为我提供一组 LAN 房间,这些房间将建筑物作为外键详细查看。

我想做的是将一根电缆连接到转接板连接器。所以该模板具有以下内容:

<li>Date Added: {{ adaptorplateconnector.date_added }}</li>
<li>Connector Type in {{ adaptorplateconnector }}:</li>
<ul>
    <li><a href="/connectortypes/{{ adaptorplateconnector.connector_type_id.id }}/">{{ adaptorplateconnector.connector_type_id.type }}</a></li>
</ul>
<li>Strand connected to  {{ adaptorplateconnector }}:
<ul>
    {% for strand in adaptorplateconnector.strand_set.all %}
    <ali><a href="/strands/{{ strand.id }}/">{{ strand }}</a></li>
    {% endfor %}
</ul>

然而,我没有得到任何连接到转接板连接器的股线。以下是相关模型:

class AdaptorPlateConnector(models.Model):
    adaptor_plate_id = models.ForeignKey('AdaptorPlate')
    connector_type_id = models.ForeignKey('ConnectorType')
    strand_position = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.strand_position

class Strand(models.Model):
    cable_id = models.ForeignKey('Cable')
    end1_plate_connector_id = models.ForeignKey('AdaptorPlateConnector', related_name= 'end1_adaptor_plate_connector')
    end2_plate_connector_id = models.ForeignKey('AdaptorPlateConnector', related_name= 'end2_adaptor_plate_connector')
    in_use = models.CharField(max_length=200)
    desc = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return "End1: " + self.end1_plate_connector_id.__unicode__() + ", End2: " + self.end2_plate_connector_id.__unicode__() + ", Cable: " + self.cable_id.__unicode__()

如何获取与正在查看的 AdaptorPlateConnector 相关的链列表?任何见解将不胜感激。我正在使用通用视图,此模板用于 DetailView

【问题讨论】:

  • 您的代码看起来不错。您确定您的数据库中存在StrandAdaptorPlateConnector 实例吗?
  • 我在 django 管理面板中创建了正确链接的测试条目,所以我不确定为什么它们不会在视图中链接在一起

标签: django django-models django-templates


【解决方案1】:

您有两个从StrandAdaptorPlateConnector 的关系,因此您正确地使用了related_name 来命名反向关系。这意味着您必须使用以下名称之一:

{% for strand in adaptorplateconnector.end1_adaptor_plate_connector.all %}

{% for strand in adaptorplateconnector.end2_adaptor_plate_connector.all %}

请注意,您对related_name 的实际选择有点奇怪:如此处所示,它是您用来从AdaptorPlateConnector 引用Strand 的名称。

(另外,与此无关,但请不要在ForeignKeys的名称中使用_id:底层数据库字段是一个ID,但字段类本身是对实际相关模型实例的引用,不是 ID。)

【讨论】:

  • 非常感谢!这解决了我遇到的问题。正如你所描述的,我会考虑让我的模型变得更好。说真的,你让我很开心!
  • 如果我将模型引用的名称重构给其他人,我是否应该将它们称为 end1_plate_connector 并将 _id 关闭?
  • 是的,这样更好。 related_name 属性可能应该在某处包含 strand
  • 感谢您的帮助!我是 Django 新手,仍在学习中,但您帮助我解决了我正在构建的一个巨大问题。希望你周末过得愉快!
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2013-06-09
  • 2018-05-04
  • 2021-02-23
  • 2016-06-23
  • 2021-06-16
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多