5

我最终试图通过扩展类型验证 FileField。但是我什至无法获得该字段的干净方法来获取 POSTed 值。

from django.forms.forms import Form
from django.forms.fields import FileField
from django.forms.util import ValidationError

class TestForm(Form):        
    file = FileField(required=False)

    def clean_file(self):
        value = self.cleaned_data["file"]
        print "clean_file value: %s" % value
        return None     

@localhost
def test_forms(request):
    form = TestForm()    
    if request.method == "POST":
        form = TestForm(request.POST)        
        if form.is_valid():
            print "form is valid"
    return render_to_response("test/form.html", RequestContext(request, locals()))

当我运行代码时,我得到以下输出:

clean_file value: None
form is valid

换句话说,clean_file 方法无法获取文件数据。同样,如果它返回 None,则该表单仍然有效。

这是我的表单html:

<form enctype="multipart/form-data" method="post" action="#">
   <input type="file" id="id_file" name="file">
   <input type="submit" value="Save">
</form>

我已经看到了一些带有此问题解决方案的片段,但我无法让它们与非模型表单一起使用。它们都声明了自定义字段类型。当我这样做时,我会遇到同样的问题;调用 super() 返回一个 None 对象。

4

1 回答 1

7

当您在帖子中实例化它时,您并没有传递request.FILES到表单中。

 form = TestForm(request.POST, request.FILES)

请参阅文档

另请注意,您在 POST 上两次实例化表单,这是不必要的。将第一个移入函数末尾的 else 子句(与 同级if request.method == 'POST')。

于 2010-10-07T17:56:31.197 回答