2016-02-05 6 views
1

Я знаю, что на этот вопрос уже был дан ответ на этом сайте, но для жизни меня я не могу понять. Я хочу отправить две формы сразу, с один кнопку отправки. Пожалуйста, кто-нибудь может определить, что не так с моим кодом, это сводит меня с ума.Django несколько форм один Отправить

HTML template (изм)

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title></title> 
</head> 

<body> 



<form action="{% url "list" %}" method="post" enctype="multipart/form-data"> 

       {% csrf_token %} 
       <p>{{ form.non_field_errors }}</p> 

       <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p> 

       <p> 
        {{ form.docfile.errors }} 
        {{ form.docfile }} 
       </p> 


       <p>{{ form.non_field_errors }}</p> 

       <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p> 

       <p> 
        {{ form.docfile.errors }} 
        {{ form.docfile }} 
       </p> 

       <p><input type="submit" value="Upload"/></p> 
      </form> 

      <!-- check error 
      {% if form.errors %} 
      {% for field in form %} 
      {% for error in field.errors %} 
      <div class="alert alert-error"> 
       <strong>{{ error|escape }}</strong> 
      </div> 
      {% endfor %} 
      {% endfor %} 
      {% for error in form.non_field_errors %} 
      <div class="alert alert-error"> 
       <strong>{{ error|escape }}</strong> 
      </div> 
      {% endfor %} 
      {% endif %} --> 

     </body> 

views.py

# -*- coding: utf-8 -*- 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 

from myproject.myapp.models import Document 
from myproject.myapp.forms import DocumentForm 
from myproject.myapp.forms import DocumentForm2 


def list(request): 
    # Handle file upload 
    if request.method == 'POST': 
     form = DocumentForm(request.POST, prefix="form") 
     form2 = DocumentForm2(request.POST, prefix="form2") 

     if form.is_valid() or form2.is_valid(): 
      newdoc = Document(docfile=request.FILES['docfile']) 
      newdoc.save() 

      # Redirect to the document list after POST 
      return HttpResponseRedirect(reverse('myproject.myapp.views.list')) 
    else: 
     form = DocumentForm(prefix="form") # A empty, unbound form 
     form2 = DocumentForm2(prefix="form2") # A empty, unbound form 

    # Load documents for the list page 
    documents = Document.objects.all() 

    # Render list page with the documents and the form 
    return render_to_response(
     'list.html', 
     {'documents': documents, 'form': form}, 
     context_instance=RequestContext(request) 
    ) 

forms.py

# -*- coding: utf-8 -*- 

from django import forms 


class DocumentForm(forms.Form): 
    docfile = forms.FileField(
     label='Select a file' 
     ) 

class DocumentForm2(forms.Form): 
    docfile2 = forms.FileField(
     label='Select a file' 
     ) 
+0

Пожалуйста, прочитайте документацию о FormSets https://docs.djangoproject.com/en/1.9/topics/forms/formsets/ – Othman

ответ

0

Во-первых, у вас есть 2 формы, определенные в методе просмотров form и form2, но вы только добавить form в контекст.

Во-вторых, вы не ставите две формы в двух разных тегах <form>. Вы должны поместить их в один, чтобы вы могли отправить их одновременно.

В-третьих, не связаны, но вы НЕ МОЖЕТЕ назвать свой метод взглядов list. Это ключевое слово django для структуры данных list, вы можете столкнуться с огромными проблемами, если попытаетесь использовать list в других функциях в вашем файле представлений.

Edit:

Вы продолжать использовать переменную {{ form.something }}, но у вас есть 2 формы, так что вы просто оказать первую форму в два раза, но полностью игнорировал вторую форму. Вы должны:

<form action="{% url "list" %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    {{ form2.as_p }} 
    <p><input type="submit" value="Upload"/></p> 
</form> 

Пересоздать:

Я не уверен, что вызвало 403 произойдет, но давайте попробуем заменить render_to_response с render:

from django.shortcuts import render 

def list(request): 
    # your code here 
    return render(request, 'list.html', {'documents': documents, 'form': form, 'form2': form2}) 
+0

Спасибо за советы Шан Ван. Мне немного сложно понять ваше первое замечание. Где я должен добавить 'form2'? –

+0

Прочтите документ для render_to_response: https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/#render-to-response. Аргументы 'context' содержат все переменные, которые вы собираетесь передать шаблону. Прямо сейчас у вас есть '{'documents': documents, 'form': form}', но вам не хватает 'form2'. Таким образом, это должно быть: '{'documents': documents, 'form': form, 'form2': form2}'. –

+0

Cheers мат. Однако, к сожалению, он ничего не загрузит, даже не один. –

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