У меня есть Device
, для которого многие Scans
связаны и создаются с помощью формы.
class Device(models.Model):
uuid = models.UUIDField(primary_key=True, verbose_name="UUID")
# fields omitted for brevity
class Scan(models.Model):
device = models.ForeignKey(Device, null=True, on_delete=models.SET_NULL)
Когда сканирование отправляется через форму, UUID устройства включается в данные POST.Если UUID существует, сканирование будет связано с существующим устройством, в противном случае будет создано новое устройство и сканирование будет связано с этим.
Я использую общие формы:
class DeviceForm(ModelForm):
class Meta:
model = Device
class ScanForm(ModelForm):
class Meta:
model = Scan
Вид ввопрос такой:
@login_required
def scan_test(request):
if request.method == 'GET':
device_form = DeviceForm()
scan_form = ScanForm()
# otherwise create a form instance and populate it with request data:
elif request.method == 'POST':
device_form = DeviceForm(request.POST)
scan_form = ScanForm(request.POST, request.FILES)
# is_valid is determining that UUID is not unique
if device_form.is_valid() and scan_form.is_valid():
form_data = device_form.cleaned_data
try:
device = Device.objects.get(uuid=form_data['uuid'])
except Device.DoesNotExist:
device = Device(
uuid=form_data['uuid'],
)
device.save()
scan = Scan(device=device, data=scan_form.cleaned_data['data'])
scan.save()
return HttpResponseRedirect(device.get_absolute_url())
return render(request, 'app/scan_form.html',
{'device_form': device_form,
'scan_form': scan_form})
Создание нового устройства и связанное с ним сканирование Сканирование работает ОК.Однако при попытке отправки с существующим UUID устройства django сообщает об ошибке в форме «Устройство с таким UUID уже существует».и новое сканирование не сохраняется.
Я полагаю, это потому, что UUID должен быть уникальным, а device_form.is_valid()
имеет значение False для существующего устройства / UUID, чтобы внутренний код сохранения не выполнялся.
Каким будет простой способ убедиться, что форма все еще проверяется (в том числе проверяется правильность UUID), но позволяет выполнять код создания Scan?