2012-10-03 3 views
2

장고에서 이것을하려고합니다 : 관리자에 개체를 저장할 때 주먹 개체의 필드 중 하나를 기반으로 다른 유형의 다른 개체도 저장하려고합니다. 이렇게하려면 두 번째 개체가 이미 있는지 확인하고 첫 번째 개체의 특정 필드에 대해서만 유효성 검사 오류를 반환해야합니다. 내 문제는 작업이 삽입 된 경우에만 유효성 검사 오류가 필드에 나타나길 원합니다.Django 양식 필드 유효성 검사 - 작업이 삽입 또는 업데이트인지 확인하는 방법?

작업이 업데이트인지 삽입인지에 따라 특정 관리 양식 필드에 대한 유효성 검사 오류를 어떻게 표시합니까?

P. 모델 유효성 검사의 경우 유효성 검사기가 값 매개 변수만을 사용하므로 불가능하다는 것을 알고 있지만 양식 유효성 검사가 가능해야한다고 생각합니다.

#inside your class model ... 
def clean(self): 
    is_insert = self.pk is None 
    from django.core.exceptions import ValidationError, NON_FIELD_ERRORS 
    #do your business rules 
    if is_insert: 
     ... 
     if __some_condition__ : 
      raise ValidationError('Dups.') 

답변

5

이것은 장고 관리 양식에 clean_ [name_of_field] 메소드를 작성하여 수행 할 수 있습니다. 삽입 또는 업데이트 작업은 self.instance.pk를 테스트하여 확인할 수 있습니다.

class EntityAdminForm(forms.ModelForm): 
    def clean_field(self): 
     field = self.cleaned_data['field'] 
     insert = self.instance.pk == None 
     if insert: 
      raise forms.ValidationError('Some error message!') 
     else: 
      pass 
     return field 

class EntityAdmin(admin.ModelAdmin): 
    form = EntityAdminForm 

당신은 장고 관리자로 엔티티 모델을 등록 할 때 다음 EntityAdmin 클래스를 사용해야합니다 : (아마도)입니다

admin.site.register(Entity, EntityAdmin) 
+0

나는 이렇게 여러 가지 옵션을 시도 완벽하게 작동 – diek

0

당신은 당신의 custom validation at the model level 쓸 수 있습니다. clean 메서드에서 특정 필드에 대해 오류를 설정할 수 있습니다.

자세한 내용은 cleaning and validating fields that depend on each other에 대한 문서를 참조하십시오.

+0

예, 유효성 검사 오류가 필요한 필드에만 표시됩니까? –

+0

작전! 죄송합니다 : Model.clean()에 의해 발생한 ValidationError 예외는 특수 키 오류 사전 키 NON_FIELD_ERRORS에 저장됩니다.또한 유효성 검사를 필드에 바인딩하는 데 관심이 있습니다. – danihp

+0

@albundy, https://code.djangoproject.com/ticket/16986 링크를 클릭하십시오. 그리고 뉴스로 돌아 가라. – danihp

0

이 모델에 대한 모델 양식을 만듭니다

+0

네, 그렇게 할 수 있다는 것을 알고 있지만 작업이 업데이트 또는 삽입인지 여부를 어떻게 알 수 있습니까? –

+0

그럴 수 있다는 것을 알고 있다면 왜 "특정 관리 양식 필드에 대한 유효성 검증 오류를 표시합니까?" Andrew는 이미 [당신의 다른 질문에] (http://stackoverflow.com/questions/12665153/django-model-field-validator-function-used-for-for-date-or-insert) pk를 확인할 수 있다고 말했습니다. 그 물건이 구원 받았는지 보아서, 나는 그 사람을 되풀이 할 필요가 없다고 생각했다. – Alasdair

+0

당신은 내 질문의 일부만 붙였습니다. :) 당신은 첫 번째 부분에 대답했다, 나는 두 번째했다;) –

0

없는 정확한 대답을하지만, 나는 그것을 도움이 될 것 같아요.

장고 관리자를 사용하면 get_or_create 방법 (Doc is here)가 ModelAdmin.save_model 방법 (doc is here) 또한

장고 API를 save 메소드를 오버라이드 (override) 할 수 있습니다. 두 값을 반환합니다. 첫 번째는 개체이고 두 번째 값은 개체 생성 여부를 나타내는 부울 값입니다 (기존 레코드 업데이트).

나에게 당신이 당신의 관련 admin.py 파일에서

FirstObjectSecondObject 있다고 가정 해 봅시다 : 나머지 부분

class FirstObjectAdmin(admin.ModelAdmin): 
... 
... 
    def save_model(self, request, obj, form, change): 
     s_obj, s_created = SecondObject.objects.get_or_create(..., defaults={...}) 
     if not s_created: 
      # second object already exists... We will raise validation error for our first object 
      ... 

, 내가 그것을 처리하는 방법에 대한 명확한 아이디어를 가지고 있지 않습니다. 현재 양식 객체가 있으므로 form.fields{'somefield'].validate(value)write a custom validation for admin으로 전화 할 수 있습니다. 아마도 clean 메서드를 재정의하고 메서드에서 raise ValidationError을 트리거하려고 시도하십시오. validate으로 전화하여 거기에서 값을 전달할 수 있습니다.

django 소스를 조사하여 django가이를 처리하는 방법을 확인하고 몇 가지 사용자 정의 유효성 검사 단계를 정의하려고 시도 할 수 있습니다.