2017-01-24 5 views
0

私はDjangoプロジェクトのデータベースに格納されたプロジェクトに画像をアップロードできるようにフォームを使用しようとしていますが、現在使用しているformsetが有効ではないことをコンソールに出力しています。 。Django formsetが無効です - なぜそうではありませんか?

私はプロジェクトに画像をアップロードするために使用しようとしているビューを使用して定義されています

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

    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(): 
     print 'Saving drawing_formset' 
     print "Before", [b.id for b in project.budget_versions.all()] 
     for drawing_form in drawing_formset: 
      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])) 

と、このビューが呼び出されたときに、私は取得していますコンソール出力は次のようになります。

("Value of project in 'upload_budget_pdfs()': ", < Project: Test 1 >)

("Value of presentations in 'upload_budget_pdfs()': ", [< Budget: Test 1: Version -1 >, < Budget: Test 1: Version -1 >, < Budget: Test 1: Version 0 >, < Budget: Test 1: Version 0 >, , , , , , , , , , , , , , , , , '...(remaining elements truncated)...'])

("Value of drawing_formset in 'upload_budget_pdfs()': ", < django.forms.formsets.DrawingFormFormSet object at 0x10cee3790 >)

Drawing formset not valid. []

私のビューのelseステートメントはここで実行されているものですが、なぜコンソールが変数がすべて正しいデータを保持していることがわかっているのか分かりません...

どうしたのですか?ここでdrawing_formset変数を初期化していますか? queryset私はDrawingUploadFormset(...)に合格していますか? is_valid()は実際に何を確認していますか?

編集

drawing_formsetの私の宣言は今あるように私は、受け入れ答えに変更を加えた:

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

しかし、それは私が今、「内部サーバーエラー」を取得していそうですと MultiValueDictKeyError行:

for drawing_form in drawing_formset: #This line is what's causing the MultiValueDictKeyError 

これはなぜわかりませんか?助言がありますか?

答えて

3

あなたのフォームセットにはデータが含まれていません。最初の引数と第2引数(またはdatafilesのキーワード引数)としてrequest.POSTとを渡す必要がありますが、これは実際のフォーム提出の場合にのみ渡す必要があります。

フォームまたはフォームセットに渡されたデータがない場合は、バインドされていないとみなされ、エラーをチェックせずにFalseを返します。

いつものパターンが時にrequest.method == 'POST'それらを渡し、そのフォームセットを検証することです:これはGETに空白のフォーム、失敗したサブミッションのエラーメッセージで埋め-でフォームを表示します

def upload_budget_pdfs(request, project_id): 
    ... 
    if request.method == 'POST': 
     drawing_formset = DrawingUploadFormset(request.POST, request.FILES, prefix='drawings', queryset=...) 
     if drawing_formset.is_valid(): 
      # save formset 
      return HttpResponseRedirect(...) 
    else: 
     drawing_formset = DrawingUploadFormset(prefix='drawings', queryset=...) 
    return render(...) # Render formset 

、およびフォームセットを保存し、成功した送信にリダイレクトします。

+0

ああ、私はそれが意味があると思う、ありがとう。あなたが答えをしたように、私は 'view'でこれを行いますか?実際のフォーム提出を処理するはずのフォームに 'Submit'ボタンがありますが、これはこの 'view'によって処理されません... – someone2088

+0

投稿が別のビューから来た場合は、 else: 'ブランチ。しかし、フォームセットが有効でないときに何をすべきかを決める必要があります。リダイレクトする必要がある場合(この場合は送信されたデータが失われます)、またはこのビューでフォームをレンダリングする必要があります。 – knbk

+0

ありがとうございました。だから私はそれを与えて、私はそれが正しい方向に私を動かしていると思うが、私は今、フォームを提出するために、[送信]ボタンをクリックすると別のエラーが発生し、PDFをアップロードした...エラーは'AttributeError'と言っています:' 'WSGIRequest 'オブジェクトには' Files 'という属性がありません。 – someone2088

関連する問題