2012-10-09 8 views
6

지금 당장 흥미로운 문제를 해결하려고합니다.Django ModelForm 유효성 검사

image 필드가있는 장고 모델은 필요하지 않지만 새 모델 인스턴스를 만들 때 기본값으로 설정됩니다.

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

나는 또한 image 필드를 포함하는 모델을 기반으로 ModelForm를 가지고 있고, 그 일부 사용자 지정 유효성 검사를 가지고있다.

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      # validate image 
     return None 

문제가 ModelFormis_valid()를 호출, 그 per the docs입니다 검증을 형성 할뿐만 아니라 모델 검증을 유발하므로 사용자가 이미지없이 모델 양식을 제출하면, 내 사용자 지정 양식 유효성 검사 코드는 기본 모델을 검증하기 위해 시도 이미지가 아니라 단지 아무 것도하지 않는 것입니다.

양식 자체에 image 필드의 값이 없으면 어떻게해야합니까?

+0

'blank = True'는 데이터베이스 레벨의 유효성 검사이고,'null = True'는 모델 레벨의 유효성 검사이므로'null = True'도 추가해야합니다. – karthikr

+3

@karthikr : 사실이 아닙니다. 'null은 순수하게 데이터베이스와 관련된 반면, blank는 검증과 관련이 있습니다. 필드에 blank = True가 있으면 양식 유효성 검사에서 빈 값을 입력 할 수 있습니다. 필드가 공백 = 거짓이면 필드가 필요합니다. '. [더 자세한 정보는 여기.] (https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikr 나는 그것을 다시 확인하고 싶을 것 같다. 문서에서'null은 순전히 데이터베이스와 관련된 반면, blank는 유효성 검사와 관련이 있습니다 .' https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

답변

10

그냥 간단한 방법으로 해결했습니다. 다른 사람에게 도움이되는 경우 여기에 답변을 추가하십시오.

The Django docs state that

... 특정 모델 인스턴스 모델 양식 방법의 액세스를 제공하는 self.instance 속성을 포함하는 모델 객체에 바인딩 모델 형태의 인스턴스입니다.

ModelForm에 이미지 값이 있는지 확인하기보다는 이미지 값이 저장된 인스턴스에서 변경되었는지 확인합니다. 이제 폼 유효성 검사는 다음과 같습니다.

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if not self.instance.image == image: 
      # validate image 
     return None 

문제가 해결되었습니다!