表格在django无效

时间:2017-08-07 21:45:18

标签: django file-upload django-forms django-templates django-views

您好我正在学习Django项目,我正在尝试使用POST通过表单上传文件以及下拉列表中的on选项。 这是我的文件:

views.py

from __future__ import unicode_literals

from django.shortcuts import render
from django.http import HttpResponse

from .forms import UploadFileForm

# function to handle an uploaded file.
from save_uploaded_file import handle_uploaded_file


def index(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return render(request, 'viewer_app/display_image.html')
        else:
            print('error')
            return render(request, 'viewer_app/index.html', {'form': form})
    else:
        return render(request, 'viewer_app/index.html')

forms.py

from django import forms

class UploadFileForm(forms.Form):
    file = forms.FileField()
    displayType = forms.ChoiceField(widget=forms.Select(), required=True)

save_uploaded_file.py

def handle_uploaded_file(f):
    with open('static/viewer_app/temp.exr', 'wb+') as recieved_exr:
        for chunk in f.chunks():
            recieved_exr.write(chunk)

的index.html

<div id="formDiv" style="display:none;" class="form" >

    <form  method="post" enctype="multipart/form-data" class="form-style">

        <label for="browse">Upload file</label>
        <input type="file" value="Browse" id="brow" /><br></br>

        <label for="display">Display type</label>
        <select id="display-type" name="display">
            <option id="RGB1" value="RGB1">RGB1</option>
            <option id="RGB2" value="RGB2">RGB2</option>
            <option id="RGB3" value="RGB3">RGB3</option>
            <option id="RGB4" value="RGB4">RGB4</option>
        </select><br></br>

        <input type="submit" value="Show file" id="showimage"/><br></br>
        {% csrf_token %}        

    </form>
</div>

因此,在我运行服务器以显示页面并选择上传并单击提交后,它不会上传并保存文件,在终端中我看到&#34;错误&#34;由于from.is_valid()不正确而显示的终端中的文本。

我尝试将{{ form.errors }} {{ form.non_field_errors }}添加到html文件中,但我仍然不知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

此外,我可以在<input>标记中看到名称属性的缺失,以及<select>标记内可能存在错误的名称属性。您应该将字段的确切名称放在html的name属性中,以使表单有界限。 <select>标签也是如此。

尝试推杆:

<input type="file" value="Browse" id="brow" name="file"/>

<select id="display-type" name="displayType">

可能你的问题将会解决。 如果我建议,为什么不使用标准的django模板表单标签,例如{{ form.as_p }}这些方法非常方便,也可以成功处理错误。你应该尝试使用它们。 check them here

修改 您尚未在forms.py中为ChoiceField提供任何选择属性。确保将属性choices作为元组提供给ChoiceField。可以这样做:

#import ugettext_lazy
from django.utils.translation import ugettext_lazy as _

#inside your form class
class UploadFileForm(forms.Form):
    CHOICES = (
        ('RGB1', _('RGB1')),
        ('RGB2', _('RGB2')),
        ('RGB3', _('RGB3')),
        #And so on
    )
    #First option in the tuple is stored in db. Second is displayed in Forms.
    displayType = forms.ChoiceField(widget=forms.Select(), required=True , choices = CHOICES)
    file = forms.FileField()

编辑2:

获取文件网址,如下所示

from django.contrib.staticfiles.templatetags.staticfiles import static

url = static('viewer_app/temp.exr')
#See if temp.exr exists prior to this. Otherwise create a file manually  or through python.

然后通过提供此URL打开文件。

我再次建议您查看ModelForms。它们完全不需要以这种方式编写文件。

希望它有所帮助。感谢。