Как сохранить клонированные данные в базе данных

Сейчас у меня есть следующая страница, которая использует 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)'
                })
        }

Кто-нибудь может помочь мне в этом? Спасибо :)

Вернуться на верх