Django多个表单提交 [英] Django multiple forms one Submit

查看:87
本文介绍了Django多个表单提交的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这个问题已经在这个网站上回答过了,但是对于我来说,我无法理解。我想一次性提交两种表格,使用一个提交按钮。请问,任何人都可以确定我的代码有什么问题,这正在使我疯狂。



HTML模板(编辑)

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

< body>



< form action ={%urllist%}method =postenctype =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 =submitvalue =上传/>< / p>
< / form>

<! - 检查错误
{%if form.errors%}
{%表单中的字段%}
{%表示字段中的错误。错误%}
< div class =alert alert-error>
< strong> {{error | escape}}< / strong>
< / div>
{%endfor%}
{%endfor%}
{%for form.non_field_errors%}
< div class =alert alert-error>
< strong> {{error | escape}}< / strong>
< / div>
{%endfor%}
{%endif%} - >

< / body>



views.py

 # -  *  - 编码: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
$来自myproject.myapp.models的文件
从myproject.myapp.forms导入文件
从myproject.myapp.forms导入DocumentForm
DocumentForm2


def list(请求)
#处理文件上传
如果request.method =='POST':
form = DocumentForm(request.POST,prefix =form)
form2 = DocumentForm2 (request.POST,prefix =form2)

如果form.is_valid()或form2.is_valid():
newdoc = Document(docfile = request.FILES ['docfile'] )
newdoc.save()

#在POST之后重定向到文档列表
return HttpRes ponseRedirect(reverse('myproject.myapp.views.list'))
else:
form = DocumentForm(prefix =form)#一个空的,未绑定的形式
form2 = DocumentForm2 =form2)#一个空的,未绑定的表单

#加载列表页面的文档
documents = Document.objects.all()

#渲染列表页面与文件和表单
返回render_to_response(
'list.html',
{'documents':documents,'form':form},
context_instance = RequestContext请求)

forms.py

 # -  *  - 编码:utf-8  -  *  -  

from django import forms


class DocumentForm(forms.Form):
docfile = forms.FileField(
label ='选择一个文件'


class DocumentForm2(forms.Form):
docfile2 = forms.FileField(
label ='选择一个文件'


解决方案

首先,您的意见中定义了2个表单方法表单 form2 ,但您只需将表单添加到您的上下文。



其次,您不要将两个表单放在两个不同的< form> 标签中。你应该把它们放在一起,所以你可以同时提交它们。



第三,不相关,但你不能命名你的视图方法列表。这是数据结构 list 的django关键字,如果您尝试在其他函数中使用 list ,可能会遇到很大的麻烦在您的视图文件中。



编辑



您继续使用变量 {{form.something}} 但是你有2个表单,所以你只是渲染第一个表单两次,但完全忽略了第二个表单。你应该:

 < form action ={%urllist%}method =postenctype =多部分/格式数据> 
{%csrf_token%}
{{form.as_p}}
{{form2.as_p}}
< p>< input type =submitvalue =上传/>< / p为H.
< / form>

ReEdit:



我不知道是什么导致403发生,但是让我们尝试用 render 替换 render_to_response / p>

 从django.shortcuts import render 

def list(request):
#你的代码这里
return render(request,'list.html',{'documents':documents,'form':form,'form2':form2})


I know this question has been answered before on this site, but for the life of me I can't figure it out. I want to submit two forms at once, with one submit button. Please, can anybody identify what is wrong with my code, this is driving me insane.

HTML template (edited)

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

解决方案

First, you have 2 forms defined in your views method form and form2, but you only add form to your context.

Secondly, you don't put 2 forms in two different <form> tags. You should put them in one so you could submit them at the same time.

Thirdly, not related, but you CANNOT name your views method list. That's a django keyword for data structure list, you could run into huge trouble if you try to use list in other functions in your views file.

Edit:

You keep using variable {{ form.something }} but you have 2 forms, so you just render the first form twice but completely ignored the second form. You should:

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

ReEdit:

I'm not sure what caused the 403 to happen, but let's try replace render_to_response with render:

from django.shortcuts import render

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

这篇关于Django多个表单提交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆