Переопределить проверку поля формы django - PullRequest
0 голосов
/ 31 января 2019

У меня есть 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?

...