2017-01-26 4 views
-1

Ich habe eine Django-Website, und auf einer der Seiten gibt es ein Formular, mit dem Benutzer Details zu einer Präsentation für ein bestimmtes Projekt eingeben können. Ein Projekt kann mehrere Präsentationen haben (jede Präsentation bezieht sich auf ein individuelles Budget für dieses Projekt), aber nur eine der Präsentationen wird für das "aktuelle" Budget (d. H. Das aktuell akzeptierte Budget) verwendet.Django Formset nicht gültig

Es gibt die Funktion, ein "PDF-Paket" für das Budget jeder Präsentation hochzuladen. Dazu klicken Sie im Formular auf die Schaltfläche "Datei auswählen", wählen das zu ladende PDF mit dem folgenden Dialogfeld aus Klicken Sie im Formular auf die Schaltfläche "Hochladen". Danach wird ein "PDF" -Symbol an der Stelle angezeigt, an der die Schaltfläche "Datei auswählen" angezeigt wurde. Wenn Sie auf dieses Symbol klicken, wird im Browser eine neue Registerkarte geöffnet, in der eine Vorschau der PDF-Datei angezeigt wird.

Ich versuche nun eine zweite Schaltfläche zum Formular hinzuzufügen, damit der Benutzer eine Zeichnungsdatei (die wahrscheinlich auch eine PDF-Datei ist) in das Formular hochladen kann.

Ich habe die Schaltfläche "Datei auswählen" an der richtigen Stelle im Formular, und wenn ich darauf klicke, öffnet sich ein Dialogfeld, in dem der Benutzer die Datei auswählen kann. Sobald sie die Datei ausgewählt haben, wird der Dateiname neben der Schaltfläche angezeigt, sodass die Datei dem Formular hinzugefügt wurde und bereit ist, in die Datenbank hochgeladen zu werden, wenn der Benutzer auf die Schaltfläche "Hochladen" klickt.

Wenn Sie auf die Schaltfläche "Hochladen" klicken, müssen alle in das Formular eingegebenen Informationen einschließlich der PDF-Datei und der Zeichnungsdatei zu dem Projektbudget in der Datenbank hinzugefügt werden.

Obwohl dieser Upload-Button funktionierte, als er nur die Original-PDF-Paketdatei hochgeladen hat, scheint er gebrochen zu sein, seit ich die Zeichnungsdatei dem Formular hinzugefügt habe. Wenn ich auf "Hochladen" klicke und nur eine PDF-Datei an das Formular angehängt hat, funktioniert es. Wenn ich jedoch auf "Hochladen" klicke, wenn ich eine Zeichnungsdatei an das Formular angehängt habe, wird die Datei nicht hochgeladen sagen:

(‚Zeichnung nicht gültig FormSet‘, [])

ich weiß, dass dieser Ausgang aus der Sicht kommt, die der Form des PDF-Paket und Zeichnung hochladen werden verwendet wird (Es ist die Ausgabe einiger Fehlerbehandlung, die ich der view hinzugefügt habe, aber ich bin nicht sicher, warum/was verursacht diese Fehlerbehandlung Code ausgeführt wird ... Die Ansicht zum Hochladen der PDFs & Zeichnungen in das Formular definiert ist mit:

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

So ist der Grund, warum ich in der Konsole diesen Fehler bin immer ist, weil die else Klausel der if Aussage: if drawing_formset.is_valid(): ist, was ausgeführt wird.

Wie in der obigen view gezeigt wird drawing_formset definiert mit:

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

und DrawingUploadFormset in der forms.py Datei für diese Anwendung definiert sind, mit:

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

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

Ich verstehe nicht, warum die Aussage if drawing_formset.is_valid(): gibt false zurück ... kann mir das jemand erklären? Gibt es etwas, das ich falsch mache, wenn ich drawing_formset deklariere/verwende?Es scheint keine Fehler zu geben, wenn diese if Aussage ausgewertet wird, da die print Aussage gerade ein leeres Feld [] zeigt, in dem drawing_formset.errors angezeigt würde ... und dennoch wertet die if Aussage zu false aus ... Warum ist das ?

EDIT

Ok, so habe ich die Bearbeitung auf der Definition von drawing_formset, wie vorgeschlagen, und diese Linie ist jetzt:

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

ich verengt, dass der Fehler zu sein scheint kommen von der Linie for drawing_form in drawing_formset:, und habe dies mit einer try-catch umgeben, um zu sehen, ob ich genau das Problem finden kann. Dieser Teil des Codes sieht nun wie folgt aus:

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

und dies wird die folgende Ausgabe in der Konsole angezeigt wird:

ManagementForm Daten fehlen oder mit()

manipuliert wurden

Dies ist das erste Mal, dass ich eine Fehlermeldung wie diese gesehen habe und keine Ahnung habe, was es bedeutet oder wie es gelöst werden kann ... hat jemand irgendwelche Vorschläge?

EDIT

ich die gegebene Antwort als ‚akzeptiert‘ markiert haben, da dies Teil der Lösung war, und wies mich in die richtige Richtung für die vollständige Lösung zu finden.

Falls jemand anderes ein ähnliches Problem hat, werde ich hinzufügen, dass, um dies voll funktionsfähig zu bekommen, ich die drawing_formset Variable in meiner Vorlage enthalten musste.

Ich tat dies durch die folgende innerhalb der entsprechenden HTML-Tag nisten:

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

Antwort

1

Sie haben keine POST-Daten zu DrawingUploadFormset nicht bestanden.

+0

Ich habe versucht, seine Definition zu ändern: 'drawing_formset = DrawingUploadFormset (request.POST, request.FILES, prefix =" Zeichnungen ", queryset = Drawing.objects.filter (budget__in = Präsentationen) .order_by ('budget__presentation_date', 'budget__created ')) ', aber wenn ich jetzt versuche, das Formular zu senden, nachdem ich eine PDF - Datei als Zeichnung hochgeladen habe, bekomme ich eine Fehlerseite mit:' MultiValueDictKeyError at/projects/6215/upload - budget - pdf/', und die traceback zeigt an, dass die Zeile 'if drawing_formset.is_valid():' den Fehler verursacht ... Ich verstehe nicht, was daran falsch ist ...? – someone2088

+0

Ah, ok, ich sollte 'request.POST.get()' verwenden - was ich geändert habe, aber jetzt bekomme ich einen 'TypeError', der sagt:' get() braucht mindestens 2 Argumente (1 gegeben) '... Ich kann nicht sehen, wie ich es schon als Argument angegeben habe, da ich nur leere Klammern verwendet habe ... aber vermutlich bedeutet das, dass ich einen Parameter übergeben sollte, ich bin mir nur nicht sicher was ich sollte vorbei sein ... Irgendwelche Ideen? – someone2088

+0

Wovon redest du? Wo hast du '.get()' benutzt, und warum? Und ist das nicht genau das gleiche Problem, das Sie vor ein paar Wochen gefragt haben? –

Verwandte Themen