2011-01-19 17 views
11

原諒我,如果這已被回答之前,我無法找到一個答案,其中驗證取決於內聯表格的聚合。Django管理員驗證的內聯形式依賴於所有表單之間的字段總數

小背景:我正在爲保險經紀人制定一個網站,該網站有該政策的「政策」和「全面委員會」。還有'經銷商'加入到'政策'以及一個委託給他們(可以有任何數量的經銷商)。分銷商之間的佣金總額必須低於總佣金。

我有一個admin.ModelForm的政策,下面我有一個admin.InlineTabular可以有多個經銷商通過'添加'按鈕,這一切都完美的作品。

但是,我似乎無法弄清楚如何對它們進行驗證,以便基本上可以將所有佣金加起來,然後如果它大於總佣金,則會拋出ValidationError。

我試過乾淨的(),但不知道如何訪問InlineTabular清潔數據,如果它是可用的!

在此先感謝您的幫助!

托馬斯

+0

類似的問題:HTTP://計算器.com/questions/877723/inline-form-validation-in-django – utapyngo 2015-02-19 10:45:17

回答

19

我知道這個問題是問在很久以前,但因爲我有同樣的問題掙扎,我想這可能是有用的。

這裏的關鍵是定義一個自定義表單嵌入到表格管理表單中,然後覆蓋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 2015-01-14 23:08:07