0

潜在的なクライアントに関する詳細のコレクションを含む見積もりがあります。名前、住所など。簡単なもの。次にinlineformset、主な見積もりに関連付けられている製品、労働力などのいくつかの s があります。

私が抱えている問題は、ちょっとしたキャッチ 22 です。私の考えでは、この方法で検証を行うことでした。

  1. 走るmainForm.is_valid()
  2. メイン フォームが検証されたら、それを保存して「サブ」フォームに移動します ( inlineformsets)
  3. 走るmy_inlineformset.is_valid()
  4. が検証された場合はmy_inlineformset、それも保存し、mainFormmainFormID で に「添付」します。

問題は次のとおりです。メイン フォームが検証されない場合、フォームは保存されません。保存されない場合、「添付」するものは何もありません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しますか?mainmain

では、同じページの別のフォームが検証されない場合、インライン フォームセット データをどのように保持するのでしょうか?


編集

このページ (4 つのフォーム (メイン フォームと 3 つのインライン フォーム) があります) を 4 つのステップに分割することについて疑問に思っています。ユーザーは各フォームに個別に入力する必要があります。そうすれば、上記の問題を心配することなく安全に検証できます。もちろん、これはユーザーに必要以上の作業をさせているようです。

4

2 に答える 2

0

このすべてのフォームを 1 ページに表示するアプローチは問題ないと思いますが、フォームセットは必要ないのでしょうか。..完全にはわかりませんが、ページ内の各フォームのインスタンスが 1 つだけ必要な場合は、フォームセットはまったく必要ないかもしれません。

検証については、3 つの異なるフォームを処理するだけで、保存プロセスですべての保存管理を手動で行い、メイン フォームを保存する前に (コミット = False)、複数の関係を割り当てます。

M がメイン モデル用であり、M が外部キーを持つ関連モデル用の A、B であると仮定すると、次のように実行できます。

# views.py ...

def my_display_forms_view(request):
    if request.method == 'POST':
        m = M()
        a = A()
        b = B()

        a_form = AForm(request.POST, instance=a)
        b_form = BForm(request.POST, instance=b)
        m_form = MForm(request.POST, instance=m)

        if a_form.is_valid() and b_form.is_valid() and m_form.is_valid():
            a = a_form.save()
            b = b_form.save()
            m = m_form.save(commit=False); # don't save it to db still
            m.a = na
            m.b = nb
            m.save()
            # eventually do some more stuff
    else:
       # generate new unbound forms here
       a_form = AForm()
       b_form = BForm()
       m_form = MForm()
    return render_to_response('template.html', {'m_form': m_form, 'a_form': a_form, 'b_form': b_form}, context_instance=RequestContext(request))

そして、あなたのテンプレートで:

{% if m_form and a_form and b_form %}
<form ... >
<!-- show main form here -->
<fieldset>
<!-- here the other forms -->
</fieldset>
</form>
{% endif %}

そして、それはそれである必要があります。

于 2013-04-14T19:41:03.657 に答える