2017-01-30 7 views
0

Ich habe ein Formular auf einer meiner Django-Webseiten, auf dem derzeit Informationen über Budgets für ein bestimmtes Projekt angezeigt werden. Budget & Projekt sind beide Modelle innerhalb der Datenbank.Django-Formularübergabe - unerwartetes Verhalten

Jedes Projekt kann mehrere Budgets haben, aber nur eines dieser Budgets wird das "aktuelle Budget" sein.

Die Art und Weise, wie die Informationen angezeigt werden, besteht darin, dass eine Reihe von "Kachel" -Symbolen mit der Bezeichnung "Präsentationen" (eine für jedes Budget) angezeigt wird. Wenn eine der Kacheln "Präsentation" ausgewählt ist, wird unter den Kacheln ein Formular angezeigt, damit der Benutzer Informationen zu dieser Präsentation (Notizen, Teilnehmer, Datum usw.) eingeben kann. Das letzte "Kachel" -Symbol in der Liste ist immer eine leere Kachel mit dem Titel "Präsentation hinzufügen", auf die der Benutzer klicken kann, um eine neue Präsentation für das Projekt hinzuzufügen - und es wird eine leere Kopie des Formulars unter den vorhandenen Kacheln angezeigt .

Das Formular enthält zwei Felder für das Hochladen von Bildern (die Bilder werden mit diesem speziellen Projekt durch das Budget-Objekt zugeordnet werden, sie hochgeladen werden.

Sobald das Formular ausgefüllt ist, und die Bilddateien hinzugefügt Im Formular sollte der Benutzer auf die Schaltfläche "Senden" am unteren Rand des Formulars klicken, um diese alle in die Datenbank hochzuladen.Wenn er dann zu dieser Seite zurückkehrt, sollte er in der Lage sein, auf das "Fliesen" -Symbol für diese bestimmte Präsentation zu klicken , und das Formular sollte angezeigt werden, automatisch mit den Informationen gefüllt werden, die sie zuvor eingegeben hatten, und mit allen hochgeladenen Bilddateien, die sie hochgeladen hatten funktioniert derzeit wie erwartet, aber aus irgendeinem Grund, wenn Sie auf die Schaltfläche "Hochladen" am unteren Rand des Formulars klicken, um die Bilder und andere in das Formular eingegebene Informationen in das Budget für das Projekt hochzuladen, scheint es zwei weitere leere hinzuzufügen ‚Präsentation‘ Fliesen auf der Webseite ... und ich verstehe wirklich nicht, warum dies geschieht ...

der HTML-Code für diese Form ist:

<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> 

und die upload_budget_pdfs() Ansicht, die aufgerufen wird, wenn Das Formular wird übermittelt:

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 Die leeren "Präsentations" -Kacheln werden nur dann der Seite hinzugefügt, wenn ein Formular gesendet wird, wenn "PDF-Pakete" angehängt sind (d. h. Bilder, die mit dem ersten "Bild hochladen" -Button zum Formular hinzugefügt wurden ... Sie werden nicht zur Seite hinzugefügt, wenn das Formular gesendet wird, wenn keine "PDF-Pakete" angehängt sind - egal, ob es Zeichnungen gibt oder nicht 'PDFs angehängt (dh die Bilder werden mit dem zweiten' Bild hochladen 'Knopf zum Formular hinzugefügt).

Der Abschnitt des HTML verwendet werden, um die Bilder für die ‚PDF-Pakete‘ & ‚Zeichnungen‘ in das Formular laden:

{% 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 %} 

Ich frage mich, ob ich die Linie mit benötigen werden:

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

als Teil der {% with ... %} Aussage am Anfang dieses Abschnitts von HTML? Aber ich weiß nicht, wie ich die with mit zwei verschiedenen Argumenten gleichzeitig verwenden würde ...? Ist das möglich?

Antwort

0

können Sie einige Tests durchführen. Versuchen Sie, Ihr Formset zu modifizieren. Sagen Sie mit 1 zusätzlichen Formular und null zusätzlichen Formularen und sehen Sie, was passiert.