2010-10-07 33 views
4

我最終試圖通過擴展類型來驗證FileField。但是,即使讓這個字段的乾淨方法來獲取POST的值,我也遇到了麻煩。驗證/清除Django中非模型表單上的FileField?

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> 

我已經看到了solutions這個問題的couple snippets,但我不能讓他們與非模型的形式工作。他們都聲明自定義字段類型。當我這樣做時,我會遇到同樣的問題;調用super()會返回一個None對象。

+0

僅供參考 - 我看到request.FILES中的InMemoryUploadFile對象。 – 2010-10-07 17:26:13

回答

4

當您在帖子中實例化時,您未將request.FILES傳遞到表單中。

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

請參閱the documentation

另請注意,您在POST上實例化表單兩次,這是不必要的。將第一個函數移到函數末尾的else子句中(與if request.method == 'POST'的級別相同)。