2016-08-18 108 views
0

我試圖對用戶使用在RegistrationForm類中的clean_field函數上傳的文件進行類型檢查。驗證部分運行良好,重定向僅在上傳.kml文件時才起作用。但是當我嘗試上傳非KML文件時會出現問題。引發ValidationError似乎不起作用。而是在瀏覽器上顯示以下錯誤。Django raise Validationerror導致Valuetype錯誤

ValueError at /startanalysis/ 
The view aerial_analysis.views.second_page didn't return an HttpResponse object.It returned None instead. 

這裏是我的表單文件

class RegistrationForm(forms.Form): 
    resolution = forms.IntegerField(label='Enter required resolution : ') 
    kml = forms.FileField(label='Enter File : ') 
    CHOICES = (('1' , '1'), ('2', '2')) 
    field = forms.ChoiceField(label='Type of analysis :',choices=CHOICES) 

    def clean_kml (self): 
     if not self.cleaned_data['kml'].name.endswith('.kml'): 
      raise ValidationError("Please Upload a Valid KML File") 
     return self.cleaned_data['kml'] 

這裏是我的這個頁面

def second_page(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST,request.FILES) 
     if form.is_valid(): 
      return HttpResponseRedirect('/main') 
    else:  
     form = RegistrationForm() 
     return render(request, "secondpage.html", {'head_title': 'Head','form1': form,}) 

我希望瀏覽器只顯示在表單字段錯誤信息查看方式。我對Django相當陌生,所以我可能會錯過一個重要部分。任何形式的幫助將不勝感激。謝謝:)

回答

0

的問題是在這裏:

if request.method == 'POST': 
    form = RegistrationForm(request.POST,request.FILES) 
    if form.is_valid(): 
     return HttpResponseRedirect('/main') 

當你上傳非KML文件,該request.method仍然POST。但是,由於表單引發了ValidationError,所以form.is_valid()False。您對該場景沒有任何邏輯。所以視圖函數返回None而不是任何HttpResponse對象。

您需要在此處添加另一個else塊,以便再次呈現相同的表單。這次與表單字段一起,您還應該顯示錯誤(錯誤消息將包含您傳遞給ValidationError的參數)。

所以可以在該else塊中添加如下內容:

return render(request, "secondpage.html", {'head_title': 'Head','form1': form,}) 

(就像你的正常GET請求)

+1

你並不需要添加一個else塊,只是去縮進現有的'return render()',所以它在'else'之後而不是在裏面。 – Alasdair

+0

是的,這也是一個好主意。除非他想將附加參數傳遞給'POST'請求​​中的視圖。 – masnun

+0

工作!但現在我需要檢查如何向用戶顯示錯誤消息!在這方面有什麼幫助? –