2017-03-23 2 views
0

유효성 검사 문제가 있습니다. 양식 유효성 검사와 모델 유효성 검사를 함께 사용해야하지만 장고 (1.10)는 이와 같이 보이지 않습니다. 장고 모델 유효성 검사

class MyModel(models.Model): 
    fk = models.ForeignKey('ap.Model') 
    foo = models.CharField(max_length=12) 

    def clean(self): 
     if self.fk.som_field != self.foo: 
      raise ValidationError("This did not validate") 

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     fields = ('fk',) 

def view(request): 
    instance = MyModel(foo='bar') 
    form = MyModelForm(data=request.POST, instance=instance) 
    if form.is_valid(): 
     # process 
     # redirect 
    # display template 

그래서 나는 모델 자체에서 일부 모델의 필드 검증이 : 여기

내 설치의 짧은 버전입니다. 내 응용 프로그램의 다른 비 형식 관련 부분에서 다시 사용되기 때문에 여기에이 파일이 필요합니다.

그리고 양식에 사용자 입력 유효성 검사가 있습니다. 이 경우 제공된 fk가 유효하고 존재하는지 확인하십시오.

그러나 양식의 유효성을 검사하고 사용자가 'fk'가 유효하지 않은 경우 양식이 거부됩니다. 그러나 양식은 MyModel.full_clean을 호출하여 모델 유효성 검사를 추가합니다.

fk 필드에 데이터가 없어도 MyModel.clean()을 호출하면 RelatedObjectDoesNotExist 예외가 발생합니다.

어떻게하면됩니까? MyModel.full_clean()은 폼 자체가 유효하여 모델이 적어도 올바른 필드 유형으로 유효성이 검사되도록하기 전까지 폼에서 호출하면 안된다고 생각합니다.

try/except에 MyModel.clean 작업을 포함시켜 RealtedObjectDoesNotExist를 catch 할 수 있지만 나에게 나쁜 코드 냄새가 있습니다. MyModel.fk가 존재한다는 사실은 첫 번째 양식 계층 유효성 검사를 통해 보장되어야합니다.

답변

0

찾았 으면, 모델 양식은 양식이 유효한지 여부에 관계없이 (self.instance.full_clean()`을 호출하여) 인스턴스 유효성 검증을 수행합니다.

당신은 (그것을 확인하는 간단한 것 나는 _post_clean을 무시하려고 할 수도 있지만, 나는 그것이 clean 방법으로 동작을 고려하는 것이 더 간단 생각합니다.

을하는 대신 예외를 잡는이 문제를 방지 할 수 그 self.fk_id은 없습니다 전에 self.fk에 액세스하십시오.

class MyModel(models.Model): 
    fk = models.ForeignKey('ap.Model') 
    foo = models.CharField(max_length=12) 

    def clean(self): 
     if self.fk_id is not None and self.fk.som_field != self.foo: 
      raise ValidationError("This did not validate")