潜在的なクライアントに関する詳細のコレクションを含む見積もりがあります。名前、住所など。簡単なもの。次にinlineformset
、主な見積もりに関連付けられている製品、労働力などのいくつかの s があります。
私が抱えている問題は、ちょっとしたキャッチ 22 です。私の考えでは、この方法で検証を行うことでした。
- 走る
mainForm.is_valid()
- メイン フォームが検証されたら、それを保存して「サブ」フォームに移動します (
inlineformset
s) - 走る
my_inlineformset.is_valid()
- が検証された場合は
my_inlineformset
、それも保存し、mainForm
のmainForm
ID で に「添付」します。
問題は次のとおりです。メイン フォームが検証されない場合、フォームは保存されません。保存されない場合、「添付」するものは何もありませんinlineformset
。したがって、mainForm
が検証されず、エラーを修正するためにフォームに戻されると、inlineformset
は空白になります。そのため、ユーザーが にたくさんの情報を入力したinlineformset
のに失敗したmainForm
場合、エラーを修正するためにフォームに戻されたときに、 上のすべてのデータinlineformset
が失われます。
最初に保存しinlineformset
、メインフォームが検証された後にのみメインフォームに添付することで、この問題を回避しようとしました。これに関する問題は、大量の s を無料で節約できることinlineformset
です。それらは見積もりに添付されることはありません。何にも関連付けられておらず、本質的に、データベース内を不必要に浮遊するだけのレコードの全体的なおかしなことはしたくありません。
これが私のビューコードです:
if main.is_valid():
tmp = main.save(commit=False)
if estID != 'new':
tmp.routeNum = est.routeNum
tmp.estMap = est.estMap
tmp.estSketch = est.estSketch
if estID == 'new':
tmp.proposalID = newEstID('R')
tmp.sysType = 'R'
if estID == 'new':
pform = pFormSet(request.POST, instance=tmp, prefix="product_form")
lform = lFormSet(request.POST, instance=tmp, prefix="labour_form")
oform = oFormSet(request.POST, instance=tmp, prefix="other_form")
else:
pform = pFormSet(request.POST, instance=est, prefix="product_form")
lform = lFormSet(request.POST, instance=est, prefix="labour_form")
oform = oFormSet(request.POST, instance=est, prefix="other_form")
if pform.is_valid():
pform.save()
したがって、 main が検証されない場合、私FormSet
の s が検証のためにチェックされることはありません (そして、pform
開始される前に呼び出されたエラーがスローされます)。ただし、メインの前に検証する場合、それ自体が検証されない (したがって保存されない)場合pform
、どのように「アタッチ」pform
しますか?main
main
では、同じページの別のフォームが検証されない場合、インライン フォームセット データをどのように保持するのでしょうか?
編集
このページ (4 つのフォーム (メイン フォームと 3 つのインライン フォーム) があります) を 4 つのステップに分割することについて疑問に思っています。ユーザーは各フォームに個別に入力する必要があります。そうすれば、上記の問題を心配することなく安全に検証できます。もちろん、これはユーザーに必要以上の作業をさせているようです。