2017-08-15 44 views
0

我试图提高验证错误的位置:的Django - 表格ValidationError不工作

1)如果在start_date字段中选定的日期是今天的前一天,然后将筹集和错误。当我提出它抛出这个错误

“<”不支持“NoneType”和“datetime.date”

2)的实例之间,如果结束日期在开始日期之前的日期,它会引发另一个错误。对于这部分的部分工作,在那里我不会保存提交的表单,但它并没有提高和验证错误

我知道这是不是第一次有人问这个问题,但我跟着别人给的答案,这是不工作,我做错了?

任何帮助是非常赞赏。

下面是我的代码:

model.py:

class Leave(models.Model): 
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='+') 
    start_date = models.DateField() 
    end_date = models.DateField() 
    duration = models.FloatField() 

form.py:

class LeavesDetailForm(forms.ModelForm): 

    class Meta: 
     model = Leave 
     fields = ('employee', 'type', 'status', 'start_date', 'end_date', 'duration', 'comment') 
     widgets = {'start_date': forms.DateInput(attrs={'type': 'date'}), 
        'end_date': forms.DateInput(attrs={'type': 'date'}), 
        'employee': forms.HiddenInput(), 
        'duration': forms.HiddenInput(), 
        'status': forms.HiddenInput()} 

    def clean(self): 
     start_date = self.cleaned_data.get("start_date") 
     end_date = self.cleaned_data.get("end_date") 
     if end_date < start_date: 
     msg = u"End date should be greater than start date." 
     self._errors["end_date"] = self.error_class([msg]) 
     raise forms.ValidationError("End date should be greater than start date.!") 

    def clean_start_date(self): 
     start_date = self.cleaned_data.get('start_date') 
     if self.instance.start_date < datetime.date.today(): 
      raise forms.ValidationError("The date cannot be in the past!") 
     return start_date 

view.py:

def my_leaves_view(request): 
    form = LeavesDetailForm(request.POST or None) 
    leaves_log = Leave.objects.all().filter(employee=request.user.profile.employee.id) 
     if form.is_valid(): 
     inst = form.save(commit=False) 
     inst.start_date = form.cleaned_data['start_date'] 
     inst.end_date = form.cleaned_data['end_date'] 
     duration = (inst.end_date - inst.start_date).days 
     inst.duration = duration 
     inst.save() 
     return HttpResponseRedirect('my_leaves_content.html') 
    context = {'form': form} 
    return render(request, 'hrm/my_leaves/my_leaves_content.html', context) 

回答

0

看上去好像你刚命名功能错误。更改clean_dateclean_start_date,因为它应该是在格式clean_function_name

希望它有帮助!

+0

嗨@Jahongir我将'def clean_date(self):'切换到'def clean_start_date(self):'但不幸的是它仍然无法工作。 –

0

如果用户未提交有效日期,则在clean方法中,start_dateend_date可能是None

由于错误提示,Python将不会让您比较date实例与None

你应该检查你cleaned_data得到有效的日期,你对它们进行比较之前:

if end_date is not None and start_date is not None and end_date < start_date: 

clean_start_date方法,你应该使用start_date你从cleaned_data牵强,不self.instance.start_date

def clean_start_date(self): 
    start_date = self.cleaned_data.get('start_date') 
    if start_date < datetime.date.today(): 
     raise forms.ValidationError("The date cannot be in the past!") 
    return start_date 
+0

感谢喜为您回复@Alasdair,我已经改变了我的条件,'如果开始

+0

在'clean'方法运行之前,这些字段被单独清理。如果一个字段是无效的,它不会在'cleaned_data'的'clean'方法运行的时候,因此,你需要检查是否'get()方法返回''None'。 – Alasdair