form.is_valid()返回false(django)

11

我对Django有点新。我试图在上传文件后将其发送到另一个服务器,但是如果form.is_valid()始终返回false,我无法进入if语句。

views.py-

def sent(request):
    if request.method == 'POST':
        form = SendFileForm(request.POST, request.FILES)
        print "form is made"
        print form.errors
        if form.is_valid():
            print "form is valid"
            new_song = Song(songfile= request.FILES['songfile'])
            new_song.save()
            print "new song is made and saved"
            l = List()
            #cd = form.cleaned_data                                                                                                                   
            #SENDS THE FILE TO SERVER GIVEN PATH
            l.all_files(new_song.songfile.path)
            return HttpResponseRedirect(reverse('get_files.views.sent'))
        else:
            print "form is not valid"
    else:
        form = SendFileForm()

    songs = Song.objects.all()
    return render_to_response('sent.html', {'songs': songs,'form': form}, context_instance=RequestContext(request))

sent.html模板-

{% if form.errors %}
    <p style="color: red;">
        Please correct the error{{ form.errors|pluralize }} below.
    </p>
{% endif %}

<form action={% url "sent" %} method="post" enctype="multipart/form-data">
  {% csrf_token %}
    <p>{{ form.non_field_errors }}</p>
        <p>{{ form.songfile.label_tag }} {{ form.songfile.help_text }}</p>
        <p>
            <!--{{ form.songfile.errors }}-->
            {{ form.songfile }}
        </p>
        <p><input type="submit" value="Upload" /></p>
</form>

forms.py-

class SendFileForm(forms.Form):
    path = forms.CharField()
    songfile = forms.FileField(label='Select a music file',help_text='max. 4 megabytes')

我已经在许多论坛上搜索,但无法解决这个问题。 提前致谢!


你能添加你的“forms.py”文件内容吗? - niekas
你的表单类应该使用“驼峰命名法”命名,例如“SendFileForm”。 - niekas
好的,我会添加我的 forms.py - Badi8beach
现在它应该符合命名规范了。但是你有什么提示,为什么表单没有被验证? - Badi8beach
4个回答

15

注意:这个答案仅用于帮助你调试代码。

你可以直接在视图中打印表单错误信息。

class YourFormView(generic.edit.CreateView):

  def post(self, request, *args, **kwargs):
    form = YourForm(request.POST)
    for field in form:
        print("Field Error:", field.name,  field.errors)
      

8

默认情况下,表单中的每个字段都是必填的(required=True)。未在必填字段中提供信息的表单提交无效。您可以在模板中向表单添加 path 字段,并且该字段必须填写,或者您可以将 path 设置为非必填项:

class SendFileForm(forms.Form):
    path = forms.CharField(required=False)
    ...

或者

<form action={% url "sent" %} method="post" enctype="multipart/form-data">
...
            {{ form.songfile }}
            {{ form.path }}
...
</form>

1
啊,我完全没有注意到path字段!那是在我实现上传功能之前。现在一切都正常了,谢谢! - Badi8beach

2
问题在于你的模板中没有包含 path 输入。由于你的 request.POST 包含不完整的数据,因此你的表单无效。
以下内容在你的模板中缺失:
{{ form.path }}

在模板中,“path”输入是什么意思?我正在按照这个例子(答案)进行操作- https://dev59.com/8m025IYBdhLWcg3wqn0N - Badi8beach
“url 'sent'” 不应该指定数据发送的位置吗?而且 GET 在哪里被使用了? - Badi8beach
我现在明白你想表达什么了。在添加了“路径”之后,我添加了上传功能。谢谢。 - Badi8beach

0
除了laxmikant的回答之外,另一种调试方法是获取类似以下的错误:
class YourFormView(generic.edit.CreateView):

  def post(self, request, *args, **kwargs):
    form = YourForm(request.POST)
    print(form.errors)

注意:这只是调试技巧


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接