更新时ValidationError会引发

时间:2017-03-13 10:31:33

标签: django django-forms django-validation

我已经定义了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()

我的UpdateView:

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

1 个答案:

答案 0 :(得分:1)

如果您的表单来自ModelForm类型,则您拥有属性self.instance。然后,您可以检查是否设置了self.instance.id,并处理您的验证。

if self.instance.id:
    # raise ValidationError

如果您不使用它,请清除ID,该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已存在的名称进行更改,您将拥有两个具有相同检查的不同对象。不确定这是否可以,但这当然取决于你。