Как сохранить клонированные данные в базе данных
Сейчас у меня есть следующая страница, которая использует django form с 3 различными моделями, и все они связаны при сохранении. Изображение: Страница, отображаемая при добавлении нового устройства
Но если я добавляю еще один модуль и сохраняю. Он сохраняет только последнюю клонированную строку в базе данных, игнорируя все, что я ввел в 1-ю строку для модуля. Изображение: Добавление нового устройства с дополнительным модулем
Как мне решить эту проблему? Ниже приведены мои следующие коды:
views.py
def device_add(request):
if request.method == "POST":
device_frm = DeviceForm(request.POST) ##Part A1
dd_form = DeviceDetailForm(request.POST)
di_form = DeviceInterfaceForm(request.POST)
if device_frm.is_valid():
# Create and save the device
# new_device here is the newly created Device object
new_device = device_frm.save()
if dd_form.is_valid():
# Create an unsaved instance of device detail
deviceD = dd_form.save(commit=False)
# Set the device we just created above as this device detail's device
deviceD.device_model = new_device
# If you did not render the hostname for the device detail, set it from the value of new device
deviceD.hostname = new_device.hostname
deviceD.save()
if di_form.is_valid():
deviceI = di_form.save(commit=False)
deviceI.modulekey= new_device
deviceI.hostname = new_device.hostname
deviceI.save()
new_device=Device.objects.all()
return render(request, 'interface/device_added.html',{'devices':Device.objects.all()})
# if invalid (dd_form)
return render(request,'interface/device_add.html',{'form':device_frm, 'dd_form': dd_form, 'di_form':di_form})
# If invalid (device_frm)
else:
return render(request,'interface/device_add.html',{'form':device_frm, 'dd_form': dd_form, 'di_form':di_form})
models.py
class Device(models.Model):
hostname = models.CharField(max_length=50)
ipaddr = models.GenericIPAddressField(protocol='ipv4')
date_added = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.hostname
class DeviceDetail(models.Model):
SUBNET_CHOICES = (
('16','16'),
('17', '17'),
('18','18'),
('19','19'),
('20','20'),
('21', '21'),
('22', '22'),
('23', '23'),
('24', '24'),
('25', '25'),
('26', '26'),
('27', '27'),
('28', '28'),
('29', '29'),
('30', '30'),
)
DEV_MODS =(
('Catalyst 9606R', 'Catalyst 9606R'),
('C9300L-48T-4X', 'C9300L-48T-4X')
)
hostname = models.CharField(max_length=50)
mgt_interface = models.CharField(max_length=50)
mgt_ip_addr = models.GenericIPAddressField(protocol='ipv4')
subnetmask = models.CharField(max_length=2, choices = SUBNET_CHOICES)
ssh_id = models.CharField(max_length=50)
ssh_pwd = models.CharField(max_length=50)
enable_secret = models.CharField(max_length=50)
dev_mod=models.CharField(max_length=50, choices = DEV_MODS) ##device_model replacement
device_model = models.ForeignKey(Device, on_delete=models.CASCADE) ##The key to link up the tables
def __str__(self):
return self.hostname
class DeviceInterface(models.Model):
MODULE_ID_CHOICES = (
('TenGigabitEthernet','TenGigabitEthernet'),
('FortyGigabitEthernet','FortyGigabitEthernet'),
('GigabitEthernet','GigabitEthernet'),
('Ethernet','Ethernet'),
)
hostname = models.CharField(max_length=50)
moduleid = models.CharField(max_length = 50,choices = MODULE_ID_CHOICES)
portid = models.CharField(max_length=50)
lastportid = models.CharField(max_length=50)
modulekey = models.ForeignKey(Device, on_delete=models.CASCADE) ##The key to link up the tables
def __str__(self):
return self.moduleid
forms.py
class DeviceForm(ModelForm):
class Meta:
model= Device
fields= ['hostname', 'ipaddr']
labels = {
"hostname": "Hostname",
"ipaddr": "IP Address"
}
class DeviceDetailForm(ModelForm):
class Meta:
model= DeviceDetail
fields= ['hostname', 'mgt_interface', 'mgt_ip_addr', 'subnetmask', 'ssh_id', 'ssh_pwd', 'enable_secret', 'dev_mod']
labels = {
"mgt_ip_addr": "Management IP Address",
}
widgets = {
'enable_secret': forms.PasswordInput(),
'ssh_pwd': forms.PasswordInput()
}
def clean_hostname(self):
hostname = self.cleaned_data['hostname']
if len(hostname) < 8:
raise forms.ValidationError(f'Hostname needs to be more than 8 character long')
return hostname
class DeviceInterfaceForm(ModelForm):
class Meta:
model= DeviceInterface
# fields= '__all__'
fields = ['moduleid','portid','lastportid']
labels = {
"portid": "First Port ID",
"lastportid": "Last Port ID"
}
widgets = {
'portid':forms.TextInput(attrs={
'placeholder': 'e.g. TenGigabitEthernet1/0/1',
'class':'form-control',
'onchange':'portidChange(this.value)'
}),
'lastportid':forms.TextInput(attrs={
'placeholder': 'e.g. TenGigabitEthernet1/0/48',
'class': 'form-control',
'onchange':'portidChange(this.value)'
})
}
Кто-нибудь может помочь мне в этом? Спасибо :)