首页 > 解决方案 > Django admin,多个内联,与父级和彼此相关,无法将对象保存在一起

问题描述

我正在使用 django admin (Django==2.2) 创建设备网络管理,其中 1 个设备可以附加多个 mac 地址,同一设备可以附加多个 ip,但同时 ip 附加到 mac asdresses,我需要一起更改/添加/查看它们。

对于设备视图我没有问题,全部显示,问题在于添加/更改设备,还需要添加/更改新的mac/ip。

###From models
#Device class, without others not important parameters
class Devices(models.Model):
    ...
    name = models.CharField(max_length=63)
    ...........

    def __str__(self):
        return format(self.name)

    class Meta:
        ordering = ('name',)
        managed = False
        db_table = 'devices'
        verbose_name_plural = "Devices"

#Macs class
class Macs(models.Model):
    mac = models.CharField(max_length=17, validators=[validate_mac_adress])
    device = models.ForeignKey('Devices', related_name="Macs", on_delete=models.CASCADE)
    ...........

    def __str__(self):
        return format(self.mac)

    class Meta:
        managed = False
        db_table = 'macs'

#Ips class
    ip = models.CharField(max_length=15, validators=[validate_ipv4])
    device = models.ForeignKey('Devices', related_name="Ips", on_delete=models.CASCADE)
    mac = models.ForeignKey('Macs', on_delete=models.CASCADE)

    def __str__(self):
        return format(self.ip)

    class Meta:
        managed = False
        db_table = 'ips'

#form for inline
class IpsForm(forms.ModelForm):

    class Meta:
        model = Ips
        exclude = ('mac',)



#####from admin.py

class MACInline(admin.TabularInline): 
    model = Macs
    extra = 0

class IPSInline(admin.TabularInline): 
    title = 'IPS'
    model = Ips
    form = IpsForm
    extra = 0

    def save(self, *ags, **kwargs):
        self.ip.mac_id = self.mac.id
        super().save(*args, **kwargs)


class DeviceAdmin(......):
     .......
     inlines = MACInline, IPSInline,
     .......

目前我有一个很好的表格来添加一个新设备,带有mac内联字段和Ip内联字段,我排除了mac地址,因为它是一个ForeignKey,我不能在那里添加新的mac地址,我只能选择从现有的。

所以,我可以添加设备和mac地址,(mac只与设备有关),但是,我有添加一个ip的问题,因为它与mac和设备有关。

我收到错误:“列'mac_id'不能为空”)

如何正确编辑 IPSInline save_model,这样就可以在同一个添加表单上从基本上最后保存的 mac 中获取 mac_id?

(顺便说一句,即使我收到此错误,mac 也会被保存)

标签: djangopython-3.xdjango-admin

解决方案


推荐阅读