2017-12-14 13 views
0

私はDjangoフォーム(TestForm)に1つのフィールド、数量を含んでいます。私はまた、私のTestFormの複数のインスタンスを含むDjango formset(TestFormset)を持っています。Django formset - ユーザーのCookieに基づいて入力を検証しますか?

複数のTestForm内で指定された数量の合計がセッション変数に格納されている数値max_quantityと等しいことを検証するMy TestFormsetのカスタムclean()メソッドを記述したいとします。

私は、このバリデーションをviews.pyで実行できることを知っています(たとえば、私のformsetが検証され、クリーンアップされた後、私はTestFormの 'quantity'変数を手動で集計し、 request.session ['max_quantity']と等しく、問題が見つかった場合にはエラーをスローします)。

しかし理想的には、すべてのフォーム検証ロジックをforms.pyのclean()メソッドに移したいと思っています。しかし、個々のフォームの1つにリンクされていない外部値をFormsetに渡す方法を理解することはできません。

これは可能ですか?フォームと同じように

forms.py

from django.forms import BaseFormSet 

class TestForm(forms.Form): 
    quantity = forms.IntegerField() 

class BaseTestFormset(BaseFormset): 
    def clean(self): 
     if any(self.errors): 

      # Don't bother validating the formset unless each form is valid on its own 

      return 

     quantity = 0 

     for form in self.forms: 
      quantity += form.cleaned_data['quantity'] 

     # IF QUANTITY IS NOT EQUAL TO MAX_QUANTITY, THROW AN ERROR... 
     # ...BUT HOW DO WE GET THE MAX_QUANTITY INTO THIS FUNCTION? 

views.py

from .forms import TestForm, BaseTestFormset 

def serve_form(request): 

    TestFormSet = formset_factory(TestForm, formset=BaseTestFormset) 

    if request.method == 'POST': 
     formset = TestFormSet(request.POST) 

     # This method should check to ensure that the sum of quantities within our formsets does not exceed max_quantity 
     if formset.is_valid(): 
       # Proceed to take action 
    else: 
     # Sample initial data 
     formset = TestFormSet(initial=[{'quantity': 5}, {'quantity': 7}]) 

    # I CAN PASS MAX_QUANTITY INTO THE TEMPLATE... BUT HOW DO I GET IT INTO THE FORMSET VALIDATION METHOD? 
    return render(request, 'template.html', {'formset': formset, 'max_quantity': request.session['max_quantity']} 

答えて

1

、あなたはどこでそれを渡す必要があり方法で何かにアクセスしたい場合。あなたが好きな場合は、初期化子でそれを行うことができます。

class BaseTestFormset(forms.BaseFormSet): 
    def __init__(self, *args, **kwargs): 
     self.max_quantity = kwargs.pop('max_quantity', None) 
     super(BaseTestFormset, self).__init__(*args, **kwargs) 

    def clean(self): 
     ... 
     if quantity > self.max_quantity: 
      ... 

やビューのを:

if request.method == 'POST': 
    formset = TestFormSet(request.POST, max_quantity=request.session['max_quantity']) 
+0

もちろん!これは非常に意味があります。感謝万円 :) – Sam

関連する問題