django - 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 也会被保存)
解决方案
推荐阅读
- c++ - 从 operator+ 方法返回 nullopt
- javascript - 如何使拦截器异步jwt angular
- javascript - 将数据从一个组件推送到另一个组件
- flutter - 如何使用从有状态到无状态的小部件值
- javascript - 如何使用 javascript 删除带有 onclick 事件的类
- haskell - 我们能否获得任意类型生成类型的标识、常量和定点数据类型构造函数?
- java - 当一个使用 RestTemplate 发布时,两个具有两个端口的 Spring Boot 应用程序设置会引发 500 错误
- encryption - 哈希函数,允许在不知道输入的情况下比较输入
- python - Selenium 从元素循环中获取 xpath 返回相同的结果
- c++ - 如何使结构初始化的 std::array 更小?