2014-11-06 63 views
0

我想我可能會遺漏一些關於Django表單驗證的內容,但我認爲只有當表單沒有錯誤時,表單上運行is_valid纔會返回true。Django表單通過驗證,儘管表單錯誤

我試圖讓表格返回false,如果「endTime」或「duration」沒有設置。

class NewShiftForm(forms.Form): 
    recursionChoices = (('1','Once'),('2','Twice'),('4','Four times'),('10','Ten times')) 
    endTime = forms.CharField(max_length=16, required=False) 
    duration = forms.CharField(max_length=16, required=False) 
    employee = UserModelChoiceField(queryset=User.objects.all(), required=True) 
    recursion = forms.ChoiceField(choices=recursionChoices, widget=forms.Select()) 

    def clean(self): 
     clean_duration = self.cleaned_data.get("duration") 
     clean_endTime = self.cleaned_data.get("endTime") 
     if not clean_duration and not clean_endTime: 
      raise forms.ValidationError("You need either duration or end time") 
     return self.cleaned_data 

我覺得我的清潔功能是否正常工作,因爲我看到的形式錯誤(「你需要長或結束時間」),當我呈現我的模板形式。然而,在我看來,我將它設置爲檢查表單是否被通過is_valid

def newShift(request, year, month, day, hour, minute, positionID): 
    form = NewShiftForm() 
    validity = "This form did not pass validation" 
    if request.POST: 
     form = NewShiftForm(request.POST) 
     if form.is_valid: 
      validity = "This form passed validation" 
    startTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), 0) 
    year = int(year) 
    position_name = Position.objects.filter(id=positionID)[0] 
    return render(request, 'managers/newShift.html',{ 
     "form": form, 
     "start": startTime, 
     "position": position_name, 
     'validity': validity, 
    }) 

模板顯示有效性作爲POST之前「這種形式並沒有通過驗證」。提交後,以及POST提交後「此表單通過驗證」。

如何使表單無法驗證,如果它有表單錯誤?

非常感謝!

回答

1

你需要

if form.is_valid(): 

代替

if form.is_valid: 

,並嘗試這個(簡體版):

def newShift(request, year, month, day, hour, minute, positionID):  
    if request.POST: 
     form = NewShiftForm(request.POST) 
     if form.is_valid(): 
     print "This form passed validation" 
     return render(request, 'managers/newShift.html',{ 
      "form": form, 
     }) 
     else: 
     print "This form did not pass validation" 
     return render(request, 'managers/newShift.html',{ 
      "form": form, 
     }) 
    else: 
     # no POST request 
     form = NewShiftForm() # unbound form 
     return render(request, 'managers/newShift.html',{ 
      "form": form, 
     }) 

,你可能要根據驗證狀態

改變模板
+0

哦,男人當然是一個方法...呃?非常感謝您的快速回答! 並感謝您的結構化建議。我顯然是新的這一點,並欣賞指導:) – 2014-11-06 18:45:28

+0

@RobertTownley邑,我的榮幸!隨時歡迎您詢問是否需要幫助 – doniyor 2014-11-06 18:47:53