ValidationError возникает при обновлении

Я определил ValidationError. Он отлично работает, но когда я пытаюсь обновить свою форму, он поднимается. Из-за этого я больше не могу обновлять свою форму. Он определяется следующим образом:

def clean_examination(self):
    new_exa = self.cleaned_data.get('examination')
    try:
        old_exa=GeneralData.objects.get(examination=self.cleaned_data.get('examination'))
    except GeneralData.DoesNotExist:
        return new_exa
    if old_exa:
        raise forms.ValidationError('Object with this examination already exists!')
    return new_exa`

Можно ли "деактивировать" мой ValidationError, если форму нужно обновить?

Дополнительная информация: Моя модель:

class GeneralData(models.Model):
    examination = models.ForeignKey(Examination, on_delete=models.CASCADE, help_text='This value is pasted in automatically and is not editable!')
    attr1= models.FloatField()
    attr2= models.FloatField()

Мой вид обновления:

class GeneralDataUpdate(LoginRequiredMixin, generic.UpdateView):
    model = GeneralData
    form_class = GeneralDataCreateForm
    template_name_suffix = '_update_form'
    login_url = 'member:login'

    def get_success_url(self):
        return reverse('member:detail', kwargs={'pk': self.get_object().examination.patient_id})

    def get_context_data(self, **kwargs):
        context = super(GeneralDataUpdate, self).get_context_data(**kwargs)
        context['action'] = reverse('member:generaldata-update',
                                     kwargs={'pk': self.get_object().id})
        return context

Мой URL-адрес обновления:

url(r'examination/(?P<pk>[0-9]+)/generaldata/update/$', views.GeneralDataUpdate.as_view(), name='generaldata-update')

person Boerne    schedule 13.03.2017    source источник


Ответы (1)


Если ваша форма относится к типу ModelForm, у вас есть атрибут self.instance. Затем вы можете проверить, установлен ли self.instance.id, и выполнить проверку.

if self.instance.id:
    # raise ValidationError

Если вы его не используете, следует очистить id, который следует отправить вместе с запросом. Выбросьте ValidationError, если он есть, или продолжайте..

id = self.cleaned_data.get('id', None)
if id:
     # raise ValidationError

Пример:

def clean_examination(self):
    new_exa = self.cleaned_data.get('examination')
    try:
        old_exa = GeneralData.objects.get(
            examination=self.cleaned_data.get('examination'))
    except GeneralData.DoesNotExist:
        return new_exa

    if old_exa:
        if not self.instance.id:
            raise forms.ValidationError(
                'Object with this examination already exists!')
    return new_exa

В этой ситуации ValidationError будет подниматься только в том случае, если есть старый examination, если нет старого объекта.

Обратите внимание, что ЕСЛИ объект имеет id, изменить имя, которое уже существует, на ДРУГОЕ id, у вас будет два разных объекта с одним и тем же обследованием. Не уверен, что это нормально, но решать вам, конечно.

person Nrzonline    schedule 13.03.2017