2017-01-26 3 views
-1

У меня есть сайт Django, и на одной из страниц есть форма, которую пользователи могут использовать для ввода информации о презентации для конкретного проекта. Проект может иметь несколько презентаций (каждая презентация предназначена для отдельного бюджета для этого проекта), но только для одного из презентаций будет «текущий» бюджет (т. Е. Текущий «принятый» бюджет).Django formset недействителен

Существует функция загрузки «пакета PDF» для бюджета для каждой презентации - это делается путем нажатия кнопки «Выбрать файл» в форме, выбора PDF для загрузки с помощью диалогового окна, которое открывается, и нажав кнопку «Загрузить» в форме. После этого значок «PDF» отображается в том месте, где была отображена кнопка «Выбрать файл», и щелчок по этому значку открывает новую вкладку в браузере, в которой отображается предварительный просмотр файла PDF.

Теперь я пытаюсь добавить вторую форму в форму, чтобы позволить пользователю загрузить в форму файл чертежа (который также может быть PDF-файлом).

У меня есть кнопка «Выбрать файл» на форме, и щелчок по ней открывает диалоговое окно, которое позволяет пользователю выбрать файл. После того, как они выбрали файл, имя файла отображается рядом с кнопкой, поэтому файл добавлен в форму, готов к загрузке в базу данных, когда пользователь нажимает кнопку «Загрузить».

При нажатии кнопки «Загрузить» вся информация, введенная в форму, включая файл PDF и файл чертежа, должна быть добавлена ​​в этот бюджет проекта в базе данных.

Однако, хотя эта кнопка «Загрузить» работала, когда она просто загружала исходный файл пакета PDF, она, кажется, сломалась, так как я добавил файл «рисунков» в форму. Если я нажимаю «Загрузить» только с PDF-файлом, прикрепленным к форме, он работает, но если я нажму «Загрузить», когда у меня есть файл чертежа, прикрепленный к форме, файл не будет загружен, а моя консоль отобразит некоторый вывод говоря:

(«Drawing не formset действует», [])

Я знаю, что этот вывод исходит из того, что это используется, чтобы загрузить пакет PDF и рисунок в виде (это результат обработки некоторых ошибок, которые я добавил к view, но я не уверен, почему/что вызывает этот код обработки ошибок ... Представление для загрузки PDF-файлов & чертежей в форму определено с:

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

Так почему я получаю эту ошибку в консоли, потому что в статье else в if заявление: if drawing_formset.is_valid(): является то, что в настоящее время запуска.

Как показано в приведенном выше view, drawing_formset определяется с:

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

и DrawingUploadFormset определяется в forms.py файла для этого приложения, с:

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

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

Я не понимаю, почему заявление if drawing_formset.is_valid(): возвращается false ... может ли кто-нибудь объяснить это мне? Есть ли что-то, что я делаю неправильно в том, как я объявляю/использую drawing_formset?При оценке этого оператора if ошибок не возникает, так как оператор print просто показывает пустой массив [], где будет отображаться drawing_formset.errors ... и все же как-то оператор if оценивает false ... Почему это ?

EDIT

Хорошо, так что я сделал правку к определению drawing_formset, как это было предложено, и эта линия сейчас:

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

Я сужен, что появляется ошибка будет приходить от линии for drawing_form in drawing_formset:, и окружили ее try-catch, чтобы узнать, могу ли я найти именно то, что проблема. Эта часть кода теперь выглядит следующим образом:

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

и это отображает следующий вывод в консоли:

ManagementForm данные отсутствуют или подделана()

Это первый раз, когда я увидел сообщение об ошибке, подобное этому, и понятия не имею, что это значит или как его решить ... у кого есть какие-то предложения?

EDIT

Я пометил данный ответ, как «принято», как это было частью решения, и указал мне в правильном направлении для нахождения полного решения.

Если у кого-то еще есть аналогичная проблема, я добавлю, что для полной работы я должен был включить переменную drawing_formset в свой шаблон.

Я сделал это вложенности следующее внутри соответствующего HTML тега:

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

ответ

1

Вы не прошли какие-либо POST данные DrawingUploadFormset.

+0

Я попытался изменить свое определение на: 'drawing_formset = DrawingUploadFormset (request.POST, request.FILES, prefix =" drawing ", queryset = Drawing.objects.filter (budget__in = presentation) .order_by ('budget__presentation_date', 'budget__created ')) ', но когда я сейчас попытаюсь отправить форму, загрузив файл PDF в качестве чертежа, я получаю страницу с ошибкой, в которой говорится:« MultiValueDictKeyError at/projects/6215/upload-budget-pdf/', и traceback, похоже, указывает, что строка 'if drawing_formset.is_valid():' то, что вызывает ошибку ... Я не понимаю, что случилось с этим ...? – someone2088

+0

А, ок, похоже, я должен использовать 'request.POST.get()' - который я изменил, но теперь получим 'TypeError', который говорит:' get() принимает не менее 2 аргументов (1 данный) '... Я не вижу, как я уже дал ему один аргумент, поскольку я просто использовал пустую скобку ... но, предположительно, это означает, что я должен передавать параметр, я просто не уверен, что я должен пройти к нему ... Любые идеи? – someone2088

+0

О чем ты говоришь? Где вы использовали '.get()' и почему? И разве это не та самая проблема, о которой вы спросили пару недель назад? –

Смежные вопросы