2011-01-19 4 views
11

これまでに回答があった場合は、検証がインラインフォームの集計に依存する回答が見つかりませんでした。Django管理者がすべてのフォーム間のフィールドの合計に依存するインラインフォームの検証

リトル背景:私はそのポリシーの「ポリシー」と「トータルコミッション」を持つ保険ブローカーのサイトを行っています。また、「リセラー」は、「ポリシー」に追加され、そこに行く委託手数料(任意の数のリセラーを持つことができます)があります。再販業者間の総手数料は総手数料よりも少なくなければなりません。

私はポリシー用のadmin.ModelFormを持っていますが、私は下に 'Add'ボタンで複数の再販業者を持つことができるadmin.InlineTabularを持っています。

しかし、私は基本的にすべての手数料を追加することができるように、私はそれらの検証を行う方法を把握していないようであり、それが合計手数料よりも大きい場合ValidationErrorをスローする。

私はclean()を試しましたが、使用可能な場合でもInlineTabularでクリーニングされたデータにアクセスする方法はわかりません!

ありがとうございました!

トーマス

+0

同様の質問に等しいことを検証する:のhttp:// stackoverflowの.com/questions/877723/inline-form-validation-in-django – utapyngo

答えて

19

は、私は質問に長い時間前に頼まれたけど、私は同じ問題で苦労するので、私はそれは便利かもしれないと思います。

ここで重要なのは、カスタムフォームセットを定義して表形式の管理フォームに埋め込んだ後、フォームセットのクリーンのメソッドをオーバーライドすることです。ここで

は例です:組成物は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'をチェックする必要があります。 –

関連する問題