2011-01-19 1 views
11

이전에 답변을 받았다면 용서해주십시오. 유효성 검사가 인라인 양식의 집합에 의존하는 경우 답변을 찾을 수 없었습니다.Django admin의 모든 양식 사이의 필드 총계에 의존하는 인라인 양식의 유효성 확인

약간의 배경 : 나는 보험 증권 브로커 사이트에 '정책'과 '전체위원회'가 있습니다. '리셀러'는 '정책'에 추가되는 커미션 (리셀러를 얼마든지 가질 수 있음)과 함께 제공됩니다. 리셀러 간의 총 커미션은 총 커미션보다 작아야합니다.

정책에 대한 admin.ModelForm이 있으며 아래에 '추가'버튼을 통해 여러 리셀러가있을 수있는 admin.InlineTabular가 있습니다.이 모든 것이 완벽하게 작동합니다.

그러나 검증을 수행하는 방법을 알아낼 수 없으므로 기본적으로 모든 커미션을 더할 수 있으며 총 커미션보다 많으면 ValidationError를 던질 수 있습니다.

clean()을 시도했지만 사용 가능한 경우 InlineTabular에서 정리 된 데이터에 액세스하는 방법을 모르겠습니다!

미리 도움을 청하십시오!

토마스

+0

비슷한 질문 같다는 것을 유효성을 검사 할 : HTTP : // 유래 .com/questions/877723/inline-form-validation-in-django – utapyngo

답변

19

나는 문제는 오래 전에 질문을 받았다 알고 있지만, 나는이 같은 문제 고투 이후, 나는 그것이 유용한 것 같아요.

여기서 중요한 것은 테이블 형식 admin 양식에 포함 된 사용자 정의 formset을 정의한 다음 formset clean의 메서드를 재정의하는 것입니다. 여기

는 예제 : 조성은 composition_elements 구성되어, 각 composition_element는 퍼센트 필드가, 나는 총 %가 100

from django import forms 
from django.forms.models import BaseInlineFormSet 
from django.core.exceptions import ValidationError 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib import admin 
from .models import Composition, CompositionElement 

class CompositionElementFormSet(BaseInlineFormSet): 
    ''' 
    Validate formset data here 
    ''' 
    def clean(self): 
     super(CompositionElementFormSet, self).clean() 

     percent = 0 
     for form in self.forms: 
      if not hasattr(form, 'cleaned_data'): 
       continue 
      data = form.cleaned_data 
      percent += data.get('percent', 0) 

     if percent != 100: 
      raise ValidationError(_('Total of elements must be 100%%. Current : %(percent).2f%%') % {'percent': percent}) 

class CompositionElementAdmin(admin.TabularInline): 
    model = CompositionElement 
    formset = CompositionElementFormSet 

class CompositionAdmin(admin.ModelAdmin): 
    inlines = (CompositionElementAdmin,) 

admin.site.register(Composition, CompositionAdmin) 
+0

이것은 영원히 발견 할 수 있었지만 간단한 방법이 있어야한다는 것을 알았습니다. 감사. – Cerin

+0

[이 답변] (http://stackoverflow.com/a/14031135/25507)에 따르면'form.cleaned_data [ 'DELETED']'와'not form.cleaned_data'를 확인해야합니다. –