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:
manipuliert wurdenManagementForm Daten fehlen oder mit()
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>
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
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
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? –