2017-01-26 14 views
-1

私はDjangoのWebサイトを持っています。そのページの1つに、ユーザーが特定のプロジェクトのプレゼンテーションに関する詳細を入力するためのフォームがあります。プロジェクトは複数のプレゼンテーションを持つことができます(それぞれのプレゼンテーションはそのプロジェクトの個別の予算用です)が、プレゼンテーションの1つのみが「現在の」予算(つまり現在受け入れられている予算)になります。Django formsetが無効

各プレゼンテーションの予算に「PDFパッケージ」をアップロードする機能があります。フォームの[ファイルを選択]ボタンをクリックし、開いているダイアログボックスを使用してアップロードするPDFを選択し、フォームの[アップロード]ボタンをクリックします。完了すると、「ファイルの選択」ボタンが表示された場所に「PDF」アイコンが表示され、このアイコンをクリックすると、PDFファイルのプレビューが表示された新しいタブがブラウザに表示されます。

フォームに2番目のボタンを追加しようとしています。このボタンをクリックすると、ユーザーは「図面」ファイル(PDFファイルでもよい)をフォームにアップロードできます。

フォームの「ファイルを選択」ボタンをクリックしてクリックすると、ダイアログボックスが開き、ユーザーはそのファイルを選択できます。ファイルを選択すると、ボタンの横にファイル名が表示され、ファイルがフォームに追加され、ユーザーが[アップロード]ボタンをクリックしたときにデータベースにアップロードできる状態になります。

[アップロード]ボタンをクリックすると、フォームに入力されたすべての情報(PDFファイルと図面ファイルを含む)をデータベースのプロジェクト予算に追加する必要があります。

しかし、元のPDFパッケージファイルをアップロードしていたときにこの「アップロード」ボタンが機能していましたが、フォームに「図面」ファイルが追加されているため、壊れているようです。フォームに添付されたPDFのみで「アップロード」をクリックすると動作しますが、フォームに「描画」ファイルが添付されているときに「アップロード」をクリックすると、ファイルはアップロードされず、コンソールに出力が表示されます言って:

(「有効なフォームセットではない描く。」、[])

私は(この出力は、PDFパッケージをアップロードするために使われているビューから、フォームに描画されていることを知っていますviewに追加したエラー処理の出力ですが、なぜこのエラー処理コードを実行するのかはわかりません。&図面をフォームに定義するためのビューが定義されていますwith:

def upload_budget_pdfs(request, project_id): 
    project = Project.objects.get(id=project_id) 
    print("Value of project in 'upload_budget_pdfs()': ", project) 

    if request.method == 'POST': 

     presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn') 
     print("Value of presentations in 'upload_budget_pdfs()': ", presentations) 
     drawing_formset = DrawingUploadFormset(prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created')) 

     print("Value of drawing_formset in 'upload_budget_pdfs()': ", drawing_formset) 

     if drawing_formset.is_valid(): 
     #if drawing_formset != None: 
      print 'Saving drawing_formset' 
      print "Before", [b.id for b in project.budget_versions.all()] 
      for drawing_form in drawing_formset: #ERF(24/01/2017 @ 1610) This line is what's causing the MultiValueDictKeyError 
       if drawing_form.instance.budget: 
        print 'Instance', drawing_form.instance.budget 
        drawing = drawing_form.save(commit=False) 
        drawing.budget = drawing_form.instance.budget 
        drawing.save() 
       print drawing, [b.id for b in project.budget_versions.all()] 
     else: 
      print("Drawing formset not valid.", drawing_formset.errors) 


     budget_formset = BudgetPresentationFormset(request.POST, request.FILES, instance=project, prefix="presentations") 

     if budget_formset.is_valid() and budget_formset.has_changed(): 
      updated_budget_presentations = budget_formset.save() 
     elif budget_formset.has_changed(): print 'Budget formset not valid.',budget_formset.errors 

     return HttpResponseRedirect(reverse('projects:concept', args=[project_id])) 

だから私は、コンソールでこのエラーを取得していた理由は、if文のelse句からです:if drawing_formset.is_valid():が実行されているものです。

上記viewに示すように、drawing_formsetがで定義されています。私はなぜ理解していない

class DrawingUploadForm(ValidatedForm): 
    class Meta(object): 
     model = Drawing 
     fields = ['pdf',] 

DrawingUploadFormset = modelformset_factory(Drawing, form=DrawingUploadForm, max_num=12, extra=1, can_delete=False) 

drawing_formset = DrawingUploadFormset(prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created')) 

DrawingUploadFormsetをして、このアプリのためにforms.pyファイルに定義されています文if drawing_formset.is_valid():が返されますfalse ...誰も私にこれを説明することができますか? drawing_formsetの宣言/使用方法が間違っていることはありますか?このifステートメントを評価するときにエラーがないように見えます。printステートメントは空の配列[]を表示しています。drawing_formset.errorsが表示されます...そして、何らかの形でifステートメントはfalseに評価されています...これはなぜですか? [OK]を

EDIT

、提案されているようので、私は、drawing_formsetの定義に編集を行い、この行は以下のようになります。

drawing_formset = DrawingUploadFormset(request.POST.get('drawings'), request.FILES, prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created')) 

私はエラーが来ているように見えることを絞り込んfor drawing_form in drawing_formset:の行から、try-catchで囲んで、問題の内容を正確に把握できるかどうか確認してください。コードのこの部分は次のようになります。

try: 
    for drawing_form in drawing_formset: #ERF(24/01/2017 @ 1610) This line is what's causing the MultiValueDictKeyError 
     print 'for loop entered in upload_budget_pdfs() - line 1034 ' 
     if drawing_form.instance.budget: 
      drawing = drawing_form.save(commit=False) 
      drawing.budget = drawing_form.instance.budget 
      drawing.save() 
     print drawing, [b.id for b in project.budget_versions.all()] 
    except Exception as e: 
     print '%s (%s)' % (e.message, type(e)) 

と、これは、コンソールで次のような出力が表示されます。

ManagementFormデータが欠落しているか(改ざんされている)

これは私がこのようなエラーメッセージを見たのは初めてであり、それが何を意味するのか、それを解決する方法が分かっていないのです。これはソリューションの一部で、完全な解決策を見つけるための正しい方向に私を指摘して「受け入れ」として、私は与えられた答えをマークした

EDIT

誰かに同様の問題がある場合は、これを完全に機能させるために追加します。テンプレートにdrawing_formset変数を含める必要がありました。

私は、関連するHTMLタグ内に以下のように入れ子にすることで、これをしなかった:

<tr> 
    {% if not forloop.last %} 
     <td colspan="3"><label>Budget PDF package</label></td> 
    {% endif %} 

    <td colspan="3"><label>Drawings</label></td> 
    <!-- Need to include the formset in the template --> 
    {{ drawing_formset.as_table }} 
    {{ drawing_formset.management_form }} 
</tr> 

答えて

1

あなたはDrawingUploadFormsetに任意のPOSTデータが渡されていません。

+0

私はその定義を次のように変更しようとしました: 'drawing_formset = DrawingUploadFormset(request.POST、request.FILES、prefix ="図面 "、queryset = Drawing.objects.filter(budget_in = presentations).order_by( 'budget__presentation_date'、 'budget__created ') ')、私は今、フォームとしてPDFファイルを図面としてアップロードすると、' MultiValueDictKeyError at/projects/6215/upload-budget-pdf/'というエラーページが表示され、 tracebackは、 'drawing_formset.is_valid():'という行がエラーを引き起こしている行であることを示しています...これには何が間違っているのか分かりません...? – someone2088

+0

ああ、私は 'request.POST.get()'を使っているはずですが、私はそれを変更しましたが、 'get()は少なくとも2つの引数をとります) '...私は空の括弧を使ったので、すでに引数を与えているのは分かりませんが、おそらくこれはパラメータを渡す必要があることを意味しています。それに渡す必要があります...任意のアイデア? – someone2088

+0

あなたはどういうことを言っていますか?どこで '.get()'を使いましたか、なぜですか?数週間前に尋ねたこととまったく同じ問題ではありませんか? –

関連する問題