Является ли это правильным способом обновления существующих данных с помощью набора форм?
У меня есть следующий код для обновления моей базы данных с помощью formset для одной части формы. Я могу получить queryset и отобразить его в настоящее время. Но когда я отправляю запрос обратно, di_form
выдает следующую ошибку в powershell []. Может ли кто-нибудь подсказать мне, как это исправить? Спасибо.
def device_edit(request, pk):
device = Device.objects.get(pk=pk)
deviceDetail = DeviceDetail.objects.get(DD2DKEY=pk)
deviceInterface = DeviceInterface.objects.filter(I2DKEY = pk)
if request.method == 'POST':
# Device_frm contains only hostname and ip address
device_frm = DeviceForm2(request.POST)
dd_form = DeviceDetailForm2(request.POST)
di_formset = modelformset_factory(DeviceInterface, fields=('moduletype', 'firstportid', 'lastportid'), extra=1,max_num=3)
di_form=di_formset(request.POST)
device_frm.hostname = device.hostname
device_frm.ipaddr = device.ipaddr
if device_frm.is_valid():
Device.objects.filter(pk=pk).update(ipaddr=device_frm.cleaned_data['ipaddr'])
if dd_form.is_valid():
DeviceDetail.objects.filter(DD2DKEY=pk).update(mgt_interface=dd_form.cleaned_data['mgt_interface'],subnetmask = dd_form.cleaned_data['subnetmask'],ssh_id = dd_form.cleaned_data['ssh_id'],ssh_pwd = dd_form.cleaned_data['ssh_pwd'],enable_secret = dd_form.cleaned_data['enable_secret'], dev_mod = dd_form.cleaned_data['dev_mod'])
if di_form.is_valid():
for instances in deviceInterface:
DeviceInterface.objects.filter(I2DKEY = pk).update(moduletype = di_form.cleaned_data['moduletype'], firstportid = di_form.cleaned_data['firstportid'], lastportid = di_form.cleaned_data['lastportid'])
return redirect('/device/', {'device':Device.objects.all, 'devices':device})
else:
print(di_form.errors)
else:
device_frm = DeviceForm2()
dd_form = DeviceDetailForm2()
di_form = DeviceInterfaceForm()
return render(request, 'interface/device_edit.html',{'form': device_frm, 'dd_form': dd_form, 'di_form': di_form, 'devices':device, 'deviceDetail':deviceDetail, 'deviceInterface':deviceInterface })