【问题标题】:Django Admin Filtering a OneToOneFieldDjango 管理员过滤 OneToOneField
【发布时间】:2019-03-27 01:09:15
【问题描述】:

我正在尝试构建一个应用程序来管理我们拥有的一些网络设备。但我需要帮助来弄清楚如何为交换机和网卡创建模型。

所以我创建了 3 个模型:

  1. 与设备的外键链接的网卡。例如 server-dc01 有一个网卡。
  2. 开关,这是我的开关。
  3. SwitchPort,在这里我可以创建端口并将它们链接到交换机。因此,如果一个交换机有 24 个端口,我需要创建 24 个交换机端口并将它们全部链接到我的交换机。有点烦。我不知道这是不是最好的。

这是我现在拥有的模型:

class NetworkCard(models.Model):
    equipment = models.ForeignKey('Equipment', on_delete=models.CASCADE)
    attached_to_port = models.OneToOneField('SwitchPorts', on_delete=models.CASCADE, blank=True, null=True)
    def __str__(self):
        return self.name

class Switch(Equipment):
    number_of_ports = models.PositiveSmallIntegerField()

class SwitchPorts(models.Model):
    number = models.PositiveSmallIntegerField()
    switch = models.ForeignKey('Switch', on_delete=models.CASCADE)

因此,在管理员中,我可以将网卡添加到设备,然后将该网卡“插入”到交换机端口。但是,当然,当我有 10 个交换机和 48 个端口时,下拉选择太长了。我尝试了 raw_id_field,但它也不是真正的用户友好。

我想要的是这样的 admin : - 一个下拉选择,我可以在其中选择开关 - 第二个下拉列表,我可以在其中选择之前选择的交换机上的端口,仅显示该交换机上的空闲端口。

因此,我的问题是:

  • 我的交换机端口模型好用吗?
  • 如果是,如何让这两个选择按我的意愿工作?
  • 如果没有,我该怎么办?

我也试过没有交换机端口模型。所以一张卡只连接到一个开关。在这种情况下,我可以添加一个数字(在 PositiveSmallIntegerField 中)来定义卡插入交换机上的哪个端口。非常用户友好...但是我需要在交换机端的端口上添加有关 vlan 的信息。

各位有什么想法吗?

谢谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为您正在寻找的是django-smart-selects。这个包允许您将模型链接在一起,以便在管理员中,选择一个 AJAX 加载下一个可选选项。

    至于您的模型 - 我不会使用字符串表示。你可以只使用模型(即switch = models.ForeignKey(Switch, ...)。最后,我不确定继承Equipment,除非你确定它是一个抽象类(我看不到)。

    【讨论】:

    • 这个 Django-smart-selects 听起来很有趣。我会在阅读后尝试一下。
    • 对于您答案的第二部分,我不明白您所说的“字符串表示”是什么意思。并且交换机是从 Equipment 继承的,因为我有其他类型的设备(交换机、路由器、服务器、工作站......)
    • @vjuluss 我的意思是你可以使用对象Equipment 而不是'Equipment'。此外,如果您从适合Switch 的抽象基类继承。如果这回答了您的问题,您可以按向下箭头下方的复选标记,让其他人看到此答案满足您的问题。祝你好运!
    • 好的,我现在明白了。我将阅读有关 Django-smart-select 并尝试它,然后我将关闭这个问题。非常感谢!
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2011-11-13
    • 2011-03-05
    • 2011-01-23
    • 2016-03-10
    • 2013-06-22
    相关资源
    最近更新 更多