在实际验证发生之前更改django表单数据

时间:2014-12-17 15:37:46

标签: django django-forms django-templates django-views

我正在开发一个应用程序,我正在使用时间字段来节省时间,我使用jquery插件来选择时间。我的问题是当我选择插件添加AM和PM的时间时,django表单验证返回无效表单。

我尝试了self.clean_field方法和clean方法从用户提交的时间值中删除am和pm。但没有任何办法。

我的models.py是

class Schedule(models.Model):

    day=models.CharField(max_length=2,choices=DAY_OF_WEEK)
    start_time=models.TimeField(null=True,blank=True)
    end_time=models.TimeField(null=True,blank=True)

    def __unicode__(self):
        return self.day

我的表格是

class ScheduleForm(forms.ModelForm):
    class Meta:
        model = Schedule
        widgets={
        'day':forms.TextInput(attrs={'readonly':True,'class':'day_class_name'}),
        'start_time':forms.TextInput(attrs={'class':'schedule_start_time'}),
        'end_time':forms.TextInput(attrs={'class':'schedule_end_time'}),

    }
time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']


def clean(self):
    print ' i am in clean method'
    #start=self.cleaned_data['start_time']
    #end=self.cleaned_data['end_time']
    #print start, end
   # print self.cleaned_data
    return self.cleaned_data

def clean_start_time(self):
    #print dir(self)
    start=self.get('start_time',None)
    print start
    #print self.data
    #print ' i am in clean_start_time method'
    #start=self.cleaned_data['start_time']
    #print start
    #if  start and ('AM' or 'PM' in start):
        # start.replace('AM','')
        # start.replace('PM','')
        # return start
    return start


def clean_end_time(self):
   # print ' i am in clean end_time method'
    start=self.cleaned_data['end_time']
    #print start
    #if  start and ('AM' or 'PM' in start):
     #   start.replace('AM','')
     #   start.replace('PM','')
        #return start
    return start

有人可以指导我在实际的django表格验证发生之前我必须覆盖哪个方法从值中删除am和pm。 帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

您的问题是基于对正在发生的事情的完全误解。你在cleaning_data中使用“am”或“pm”获取任何值。 Django将字符串形式转换为datetime.time的实际实例,这就是您所需要的。

您的问题实际上是由于您未能正确设置时间格式造成的。而不是在表单的末尾随机放置一个名为time_formats的列表,而是完全忽略它,您需要在时间字段本身上设置一个名为input_formats的值:

class ScheduleForm(forms.ModelForm):
    start_time = forms.TimeField(input_formats=['%H:%M', '%I:%M%p', '%I:%M %p'])
    ...

现在该字段将接受上午/下午的时间,您不需要做任何其他事情。

答案 1 :(得分:-1)

以下内容应该有效。覆盖干净的方法。

class ScheduleForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super(ScheduleForm, self).clean()
        # Here you remove what you need
        return cleaned_data