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

在实际验证发生之前更改django表单数据,django,django-forms,django-templates,django-views,Django,Django Forms,Django Templates,Django Views,我正在开发一个应用程序,其中我使用时间字段来节省时间,我使用jquery插件来选择时间。我的问题是,当我选择插件添加am和PM的时间时,django表单验证返回无效表单 我尝试了self.clean_field方法和clean方法从用户提交的时间值中删除am和pm。但是没有办法 我的模特是 class Schedule(models.Model): day=models.CharField(max_length=2,choices=DAY_OF_WEEK) start_time

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

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

我的模特是

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吗。
将非常感谢您的帮助

以下方法应该可以奏效。重写clean方法

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

你的问题完全是基于对正在发生的事情的误解。在U数据中,am或pm不会得到任何值。Django将字符串形式转换为datetime.time的实际实例,这就是您所需要的

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

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

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

配置jquery插件以便它向表单字段提供有效值不是更好吗?当我在clean方法中调用clean_data时,它会在执行验证后返回数据clean_data为{close':False,'day':u'MO}{'close':False,'start'u time':None,'day':u'TU','end'u time':None}{'close':False,'start'u time':None}{'day':u'TU','end'u time':None}{'close':False,'FR,'end'u time':None}{'close':False,'start'u time':None,'day':u'SA','end'u'u'u time':None}{'{'close':False,'start_time':None,'day':u'SU,'end_time':None}不,仍然不起作用。formse.errors[{'start_time':[u'Enter a valid time.]],'end_time':[u'Enter a valid time.],'end_time':[u'Enter a valid time.],{'start_time':[u'Enter a valid time.],'end_time':[u'Enter a valid time.],{'start_time':[u'输入有效时间。]],'end_time':[u'输入有效时间。]},{'start_time':[u'输入有效时间。]、'end_time':[u'输入有效时间。]、'end_time':[u'输入有效时间。]}、{'start_time':[u'输入有效时间。]、'end_time':[u'输入有效时间。]]请求、发布是可以的,因此您可以从中看到,时报毕竟没有am/pm,但它们有秒。因此,您的格式应该包括%H:%M:%S。是的,非常感谢Daniel。秒是错误的。在格式中添加秒后工作。