私は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>
私はその定義を次のように変更しようとしました: '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
ああ、私は 'request.POST.get()'を使っているはずですが、私はそれを変更しましたが、 'get()は少なくとも2つの引数をとります) '...私は空の括弧を使ったので、すでに引数を与えているのは分かりませんが、おそらくこれはパラメータを渡す必要があることを意味しています。それに渡す必要があります...任意のアイデア? – someone2088
あなたはどういうことを言っていますか?どこで '.get()'を使いましたか、なぜですか?数週間前に尋ねたこととまったく同じ問題ではありませんか? –