2012-07-06 42 views
0

我一直在尋找答案一段時間,但我真的不知道如何發生這種情況。我試圖製作一個接收2個文件的表單,並且我重寫了clean()方法來檢查名稱和擴展名是否正確。這是我有:Django自定義forms.clean()方法不工作

def clean(self): 
    cleaned_data = super(UploadForm, self).clean() 
    obs_filename = cleaned_data.get('obs').name.split('.') 
    nav_filename = cleaned_data.get('nav').name.split('.') 
    if obs_filename[0] != nav_filename[0] or [obs_filename[1], nav_filename[1]] != ['obs', 'nav']: 
    raise forms.ValidationError('Filenames do not match.') 
    if os.path.isfile(PROJECT_ROOT + '/data/unprocessed/' + '.'.join(obs_filename)) and os.path.isfile(PROJECT_ROOT + '/data/unprocessed/' + '.'.join(nav_filename)): 
    raise forms.ValidationError('Files already exist.') 
    return cleaned_data 

的問題是,當我用這個,輸入校驗不起作用(表單提交不選擇任何文件)。當我刪除這段代碼時,它工作正常。 對super(UploadForm, self).clean()的調用與自定義clean()函數的django文檔中的調用相同。我使用的是django 1.4。有什麼想法嗎?

謝謝!

+0

代碼看起來不錯。你的clean()方法是否被執行?你可以在第一行「斷言0」。 – guettli 2012-07-06 09:13:56

+0

剛剛檢查,它確實執行 – 2012-07-06 09:53:00

回答

2

文件字段有點複雜;你必須確保你的文件在你實例化時綁定到你的表單上。如果你使用基於類的通用視圖,這應該會自動發生,所以如果你沒有看到它們,那麼我猜你不是。在這種情況下,請看https://docs.djangoproject.com/en/1.4/ref/forms/api/#binding-uploaded-files。簡而言之,當您實例化表單時,您必須從request.FILES獲取文件,並將這些文件作爲單獨的參數傳遞給您的表單,例如f = MyForm(request.POST, request.FILES)

此外,請確保您的FORM標記中有enctype="multipart/form-data"

+0

我正在做你剛纔提到的,但它不工作。我基本上覆制了上傳文件的代碼並更改了變量的名稱。但謝謝你的答案! – 2012-07-09 21:03:38

+0

嗯,你在self.cleaned_data中看到什麼了嗎?它與clean_data不同嗎?那麼self.files呢? – tomds 2012-07-10 08:29:07