2012-11-26 4 views
4

이 모델은 다음과 같은 고려 외래 키 필드와 모델에 대한 사용자 정의 청소 방법 :장고 관리자 -

class Arena(models.Model): 
    crowd_capacity = models.PositiveInteger() 
    # more fields here 

class Section(models.Model): 
    name = models.CharField(max_length=10) 
    crowd_capacity = models.PositiveInteger() 
    arena = models.ForeignKey(Arena, related_name='sections') 

admin.py :

class SectionInline(admin.StackedInline): 
    model = Section 
    fk_name = 'arena' 
    extra = 1 

class ArenaAdmin(admin.ModelAdmin): 
    inlines = [ 
     SectionInline, 
    ] 

내가 확인하는 검증 방법을 추가 할 것인지의 합 모든 section.crowd_capacity가 total arena.crowd_capacity를 초과하지 않습니다.

처음에는 깨끗한 메서드로 사용자 정의 SectionFormSet을 작성하려고했지만 arena.crowd_capacity를 얻는 방법을 알지 못했습니다.

나는 또한 Arena에 깨끗한 방법을 추가하려고 시도했지만 멋진 빨간색 검증 오류를 보여 주지만 문제를 해결할 수는 없습니다. 모든 섹션을 저장 한 후에 Arena clean 메서드가 실행되는 것처럼 보이고 문제가 발생해도 section.crowd_capacity 및 w.e 섹션을 변경하면 아무 효과가 없습니다.

내가 시도 검증 방법 :

def clean(self): 
     super(Arena, self).clean() 
     capacity = 0 
     for s in self.sections.all(): 
      capacity += s.crowd_capacity 

     if capacity > self.crowd_capacity: 
      raise ValidationError('The sum of all sections crowd capacity ' 
            'exceeds arena crowd capacity') 

답변

4

좋아, 나는 마침내 방법을 발견했다.

분명히하기 위해, 나는 모든 섹션의 군중 용량의 합이 전체 군중 용량을 초과하지 않는지 확인하고 싶습니다.

최종 솔루션 (admin.py에서)이다 : 그것은 그게 전부

class SectionFormSet(forms.models.BaseInlineFormSet): 
    def clean(self): 
     if any(self.errors): 
      return 
     capacity = 0 
     for f in self.forms: 
      try: 
       capacity += f.cleaned_data['crowd_capacity'] 
       if capacity > f.cleaned_data['arena'].crowd_capacity: 
        raise ValidationError('The sum of all sections crowd capacity ' 
               'exceeds arena crowd capacity') 
      except KeyError: 
       # in case of empty form 
       pass 


class SectionInline(admin.StackedInline): 
    model = Section 
    formset = SectionFormSet 

class ArenaAdmin(admin.ModelAdmin): 
    inlines = [ 
     SectionInline, 
    ] 

, 모델 변경없이. 매력처럼 작동합니다.