私は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']}
もちろん!これは非常に意味があります。感謝万円 :) – Sam