2017-01-30 15 views
0

DjangoのWebページの1つにフォームがあります.DjangoのWebページには、特定のプロジェクトの予算に関する情報が表示されています。予算&プロジェクトは、データベース内の両方のモデルです。Djangoフォームの提出 - 予期しない動作

各プロジェクトは複数の予算を持つことができますが、それらの予算のうち1つのみが「現在の予算」になります。

情報が表示される方法は、「プレゼンテーション」と呼ばれる多数の「タイル」アイコン(各予算ごとに1つ)があることです。 「プレゼンテーション」タイルの1つが選択されると、タイルの下にフォームが表示され、そのプレゼンテーションに関する情報(メモ、出席者、日付など)を入力します。リスト内の最後の「タイル」アイコンは常に「プレゼンテーションの追加」という空白のタイルになります。このプレゼンテーションをクリックすると、プロジェクトの新しいプレゼンテーションが追加され、既存のタイルの下にフォームの空白のコピーが表示されます。

はフォームが(フォームが記入された後の画像が

。彼らはにアップロードされていることを予算オブジェクトを介して、特定のプロジェクトに関連付けされ、画像ファイルが追加画像をアップロードするための2つのフィールドを含みフォームの下部にある[送信]ボタンをクリックしてこのすべてをデータベースにアップロードし、このページに戻ると、その特定のプレゼンテーションの「タイル」アイコンをクリックする必要がありますフォームが表示され、以前に入力した情報とアップロードされた画像ファイルが自動的に入力されます。

これはフォームの下部にある[アップロード]ボタンをクリックすると、フォームに入力された画像やその他の情報をプロジェクトの予算にアップロードするために、何らかの理由で現在は正常に動作していますなぜこれが起こっている「表示」のWebページへのタイル...と私は本当に...

を理解していない、このフォームのHTMLは次のとおりです。

<form method="POST" enctype="multipart/form-data" data-vat-status="{{project.vat_status}}" data-view-url="{% url 'projects:concept_save_ajax_2' project.id %}" class="autosave_form formset full-width" action="{% url 'projects:upload_budget_pdfs' project.id %}"> 
    {% csrf_token %} 
    <div id="presentations" class="app-wrap center-apps middle"> 
     {% with get|apps:'Budgets' as costing_app %} 
      {% for presentation in presentations %} 
       <div id="presentation-{{presentation.id}}" class="app sm {% if presentation.current_marker %}{{costing_app.color}}{% else %}{{app.color}}{% endif %}"> 
        <a href="" class="filler"></a> 
        <a class="show-presentation bottom-right" name="presentation-{{presentation.id}}"><img class="icon" src="{% static 'img/edit-white.png' %}"></a> 

        <ul class="flush"> 
         <li class=""><h2 class="p-t-lg">Presentation {{forloop.counter}}</h2></li> 
         <li>{{presentation.presentation_date|date:"d M y"|xor}}</li> 
         <li>{{presentation.details|xor|truncatechars:50}}</li> 
         {% if presentation.current_marker %}<li>({% if project.deposit_received%}Deposit{% else %}Current{% endif %} budget)</li>{% endif %} 
        </ul> 
       </div> 

      {% if forloop.last %} 
      {% endif %} 

      {% endfor %} 
       {# Add a new presentation #} 
      <div id="presentation-new" class="app sm {{costing_app.color}} outline"> 
       <a id="new_presentation" data-view-url="{% url 'projects:save_new_presentation' project.id %}" class="filler show-presentation" name="presentation-new"></a> 
       <a name="presentation-new"></a> 
       <span class="big-head">+</span> 
       <h2 class="no-m">Add presentation</h2></li> 
      </div> 
     {% endwith %} 
    </div> 

    <div class="middle"> 
     {{presentation_formset.management_form}} 
     {{drawing_formset.management_form}} 

     <div class="col-9 centered-block p-t-lg"> 
      <table class="left fixed text-sm slim"> 
     {# New presentation without budget #} 
       <tbody> 

       </tbody> 




     {# Edit presentation details #} 
       {% for presentation_form in presentation_formset %} 
        <tbody id="pres{{forloop.counter}}" class="presentation-form" name="presentation-{{presentation_form.instance.id|xor:'new'}}" style="display: none;"> 


         {% if not forloop.last and presentation_form.instance.budget_items.count %} 
          <tr class="split-rows"> 
           <td colspan="3">Exc VAT {% if not presentation_form.instance.current_marker %}{{presentation_form.instance.grand_total_exc_vat|money:'£'}}{% else %}{{project.budget_overview.updated_exc_vat|money:'£'}}{% endif %}</td> 
           <td colspan="3">Inc VAT {% if not presentation_form.instance.current_marker %}{{presentation_form.instance.grand_total_inc_vat|money:'£'}}{% else %}{{project.budget_overview.updated_inc_vat|money:'£'}}{% endif %}</td> 
          </tr> 
         {% endif %} 
          <tr> 
           {% for hidden in presentation_form.hidden_fields %} 
            <td class="hidden">{{ hidden }}</td> 
           {% endfor %} 
          </tr> 
          {% for field in presentation_form.visible_fields %} 
           <tr class="split-rows"> 
            {% if not field.name == 'pdf_package_dep' %} 
             <td colspan="6"><label>{{field.label}}</label></td> 
            {% endif %} 
           </tr> 

           <tr class="split-rows"> 

            <td colspan="6"> 
             {% if not field.name == 'pdf_package_dep' %} 
              {% if field.name == 'presentation_date' %} 
               {% with presentation_form.instance.meeting as meeting %} 
                {% include "projects/includes/meeting_bit.html" with employee=request.user.employee meeting=meeting UID=presentation_form.instance.id %} 
               {% endwith %} 
               {# <a class="ical_trigger button" data-view-url="{% url 'events:add_to_cal' %}" {% if not field.value %}style="display:none"{% endif %}>Add to calendar</a> #} 
              {% else %} 
               {{field}} 
              {% endif %} 
             {% endif %} 
            </td> 
           </tr> 
          {% endfor %} 

          {% if presentation_form.instance.id %} 

           {# PDF uploads #} 
           {% with drawing_form=drawing_formset|getval:forloop.counter0 %} 
            {# budget_pdf_form=budget_pdf_formset|getval:forloop.counter0 #} 
            <tr> 
             {% if not forloop.last %} 
              <td colspan="3"><label>Budget PDF package</label></td> 
             {% endif %} 

             <td colspan="3"><label>Drawings</label></td> 
            </tr> 

            <tr> 
             {% if not forloop.last %} 
              <td colspan="3" class="center"> 
               {% if presentation_form.instance.pdf_package_dep %} 
                <a class="button file-download pdf" href="{% url 'costing:pdf_open' presentation_form.instance.id %}?pdf=package_dep" target="_blank"></a><a class="pdf-clear" data-view-url="{% url 'costing:pdf_clear' presentation_form.instance.id %}?pdf=package_dep"><img class="icon m-l-sm m-b-md" src="{% static "img/bin.png" %}"></a> 
               {% else %} 
                {{presentation_form.pdf_package_dep}} 
               {% endif %} 
              </td>  
             {% endif %} 
             {% for d_field in drawing_form.visible_fields %} 
              {% if drawing_form.instance.pdf %} 
               <td colspan="3" class="center"> 
                <a class="button file-download pdf" href="{% url 'costing:pdf_open' presentation_form.instance.id %}?pdf=drawings" target="_blank"></a><a class="pdf-clear" data-view-url="{% url 'costing:pdf_clear' presentation_form.instance.id %}?pdf=drawings"><img class="icon m-l-sm m-b-md" src="{% static "img/bin.png" %}"></a> 
                <!--ERF(27/01/2017 @ 1135) Need a hidden field to actually hold the file that's uploaded to the form --> 
                <input type="hidden" name = "conceptDrawing" value="{{d_field.title}}"> 
                <!--ERF(27/01/2017) Need to include the formset in the template --> 
                {#{ drawing_formset.as_table }#} 
                {{drawing_form.as_table}} 
                {{ drawing_formset.management_form }} 
               </td>  
              {% else %} 
               <td colspan="3">{{d_field}}</td> 
               {% for d_hidden in drawing_form.hidden_fields %} 
                <td class="hidden">{{d_hidden}}</td> 
               {% endfor %} 
              {% endif %} 
             {% endfor %} 
             <tr> 
              <td colspan="1" class="p-t-md"></td> 
              <td colspan="4" class="p-t-md"><input type="submit" value="upload"></td> 
              <td colspan="1" class="p-t-md"></td> 
             </tr> 
            </tr> 
           {% endwith %} 
          {% endif %} 


         <tr> 
          <td colspan="3"> 

           <a class="button email_trigger m-t-md" style="width:auto;" data-view-url="{% url 'comms:open_email_template' project.id %}?template=6&budget={{presentation_form.instance.id}}">Email client meeting report</a> 
          </td> 
         </tr> 


         <tr> 
          <td class="p-t-md"> 
           <a {% if forloop.last %}id="refresh_presentations"{% endif %}class="update_presentation button fill">Done</a> 
          </td> 
          <td colspan="2"> 
           {% if presentation_form.instance.id and not presentation_form.instance.budget_items.count %} 
            <a class="button fill" href="{% url 'costing:delete_presentation' presentation_form.instance.id %}">Delete</a> 
           {% endif %} 
          </td> 
         </tr> 
        </tbody> 

       {% endfor %} 
      </table> 
     </div> 
    </div> 
</form> 

と呼ばれupload_budget_pdfs()ビューフォームが送信されている。

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(request.POST, request.FILES, 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: 
     print "Before", [b.id for b in project.budget_versions.all()] 

     try: 
      for drawing_form in drawing_formset: 
       print 'for loop entered in upload_budget_pdfs() - line 1034' 
       print "Value of drawing_form: ", drawing_form 
       if drawing_form.instance.budget: 
        print 'if statement entered - line 1036 ' 
        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()] 
     except Exception as e: 
      print '%s (%s)' % (e.message, type(e)) 
    else: 
     print("Drawing formset not valid. ", drawing_formset.errors) 



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

    try: 
     if budget_formset.is_valid() and budget_formset.has_changed(): 
      print("if budget_formset.is_valid() statement entered (line 1063) ") 
      #updated_budget_presentations = budget_formset.save() 
      budget_formset.save() 
      print("Value of update_budget_presentations: ", updated_budget_presentations) 
     elif budget_formset.has_changed(): print 'Budget formset not valid.',budget_formset.errors 
    except Exception as e: 
     print '%s (%s)' % (e.message, type(e)) 

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

T空白の「プレゼンテーション」タイルは、フォームに「PDFパッケージ」が添付されている場合のみ、フォームにプレースメントを追加できます(つまり、画像は最初の「画像をアップロード」ボタンを使用してフォームに追加されます)...「PDFパッケージ」が添付されていない状態でフォームが送信された場合、ページに追加されません。 'それに付随するPDF(すなわち、2番目の'画像のアップロード 'ボタンを使用してフォームに追加された画像)。

フォームに「PDFパッケージ」&「ドローイング」の画像をアップロードするために使用されているHTMLのセクションには、次のとおりです。

{% with drawing_form=drawing_formset|getval:forloop.counter0 %} 
    {# budget_pdf_form=budget_pdf_formset|getval:forloop.counter0 #} 
    <tr> 
     {% if not forloop.last %} 
      <td colspan="3"><label>Budget PDF package</label></td> 
     {% endif %} 

     <td colspan="3"><label>Drawings</label></td> 
    </tr> 

    <tr> 
     {% if not forloop.last %} 
      <td colspan="3" class="center"> 
       {% if presentation_form.instance.pdf_package_dep %} 
        <a class="button file-download pdf" href="{% url 'costing:pdf_open' presentation_form.instance.id %}?pdf=package_dep" target="_blank"></a><a class="pdf-clear" data-view-url="{% url 'costing:pdf_clear' presentation_form.instance.id %}?pdf=package_dep"><img class="icon m-l-sm m-b-md" src="{% static "img/bin.png" %}"></a> 
       {% else %} 
        {{presentation_form.pdf_package_dep}} 
       {% endif %} 
      </td>  
     {% endif %} 
     {% for d_field in drawing_form.visible_fields %} 
      {% if drawing_form.instance.pdf %} 
       <td colspan="3" class="center"> 
        <a class="button file-download pdf" href="{% url 'costing:pdf_open' presentation_form.instance.id %}?pdf=drawings" target="_blank"></a><a class="pdf-clear" data-view-url="{% url 'costing:pdf_clear' presentation_form.instance.id %}?pdf=drawings"><img class="icon m-l-sm m-b-md" src="{% static "img/bin.png" %}"></a> 

        <input type="hidden" name = "conceptDrawing" value="{{d_field.title}}"> 

        {#{ drawing_formset.as_table }#} 
        {{drawing_form.as_table}} 
        {{ drawing_formset.management_form }} 
       </td>  
      {% else %} 
       <td colspan="3">{{d_field}}</td> 
       {% for d_hidden in drawing_form.hidden_fields %} 
        <td class="hidden">{{d_hidden}}</td> 
      {% endfor %} 
      {% endif %} 
     {% endfor %} 
     <tr> 
      <td colspan="1" class="p-t-md"></td> 
      <td colspan="4" class="p-t-md"><input type="submit" value="upload"></td> 
      <td colspan="1" class="p-t-md"></td> 
     </tr> 
    </tr> 
{% endwith %} 

私はラインを使用する必要がある場合、私は疑問に思って:

{# budget_pdf_form=budget_pdf_formset|getval:forloop.counter0 #} 

{% with ... %} HTMLのこのセクションの先頭にあるステートメントの一部ですか?しかし、私はどのようにしてwithを同時に2つの異なる引数で使用するのか分かりません...?これは可能ですか?

答えて

0

いくつかのテストを行うことができます。あなたのformsetを変更してみてください.1つの余分なフォームとゼロの余分なフォームと何が起こるかを見てみましょう。