【问题标题】:Django multiple forms one SubmitDjango 多表单一份提交
【发布时间】:2016-05-15 16:43:19
【问题描述】:

我知道这个问题之前已经在这个网站上得到了回答,但对于我来说,我无法弄清楚。我想一次提交两个表单,带有 一个 提交按钮。拜托,谁能找出我的代码有什么问题,这让我发疯了。

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

【问题讨论】:

标签: python django forms python-2.7 file-upload


【解决方案1】:

首先,您在视图方法 formform2 中定义了 2 个表单,但您只将 form 添加到您的上下文中。

其次,不要将 2 个表单放在两个不同的 &lt;form&gt; 标记中。您应该将它们放在一起,以便同时提交。

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

编辑:

您继续使用变量 {{ 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})

【讨论】:

  • 感谢尚旺的提示。我有点难以理解你的第一句话。我必须在哪里添加form2
  • 阅读文档以获得 render_to_response:docs.djangoproject.com/en/1.9/topics/http/shortcuts/…context 参数包含您要传递给模板的所有变量。现在你有{'documents': documents, 'form': form},但你缺少form2。所以应该是:{'documents': documents, 'form': form, 'form2': form2}.
  • 干杯伙伴。然而,不幸的是它不会上传任何东西,甚至一个也不会。
  • 您需要详细说明上传时发生的情况。表格是否有效?你拿到文件了吗?添加一些打印语句以查看发生了什么。
  • 在我选择了我的图片并点击上传后,我在两个输入字段上都收到了“此字段是必需的”消息。我在views.py 中的else: 语句之后添加了打印检查,以查看表格是否有效。每次我刷新页面时,我的打印语句都会触发。所以看起来表格无效?再次感谢!
猜你喜欢
  • 2015-12-21
  • 2017-05-03
  • 2015-10-04
  • 1970-01-01
  • 2018-09-12
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多