python - strptime validation error django -
i have daterangepicker users set date. choice of format "dd mmm yyyy" go i'm using
datetime.datetime.strptime(time, "%d %b %y"); but still getting error
exception value:[u"'01 aug 2013' value has invalid date format. must in yyyy-mm-dd format."] any idea might going wrong? stuck on while.
def form_valid(self, form): new_obj = form.save(commit=false) new_obj.date_pickup_from, new_obj.date_pickup_to = form.cleaned_data['pickup_daterange'].split(' ') new_obj.date_delivery_from, new_obj.date_delivery_to = form.cleaned_data['delivery_daterange'].split(' ') here forms
pickup_daterange = forms.charfield( label=_('pickup within'), widget=forms.textinput(attrs={'class': 'daterange'}), validators=[ regexvalidator( regex=r'\d{2}\ \w{3}\ \d{4}\ to\ \d{2}\ \w{3}\ \d{4}', message=_(u'range must of format "mm/dd/yyyy mm/dd/yyyy"'), code='invalid_range' ) ], help_text=_('within dates want pickup?') ) delivery_daterange = forms.charfield( label=_('delivery within'), widget=forms.textinput(attrs={'class': 'daterange'}), validators=[ regexvalidator( regex=r'\d{2}\ \w{3}\ \d{4}\ to\ \d{2}\ \w{3}\ \d{4}', message=_(u'range must of format "mm/dd/yyyy mm/dd/yyyy"'), code='invalid_range' ) ], help_text=_('within dates want delivery?') ) models.py
date_delivery_from = models.datefield(_('date of delivery from'), blank=true, null=true) date_delivery_to = models.datefield(_('date of delivery to'), blank=true, null=true) function in form class calling strptime
def clean_delivery_daterange(self): daterange_pattern = re.compile(r'(\d{2}\ \w{3}\ \d{4})\ to\ (\d{2}\ \w{3}\ \d{4})') delivery_daterange = self.cleaned_data['delivery_daterange'] pickup_daterange = self.cleaned_data['pickup_daterange'] str_pickup_from, str_pickup_to = daterange_pattern.search(pickup_daterange).groups() str_delivery_from, str_delivery_to = daterange_pattern.search(delivery_daterange).groups() delivery_from = datetime.datetime.strptime(str_delivery_from, "%d %b %y") pickup_from = datetime.datetime.strptime(str_pickup_from, "%d %b %y") if delivery_from < pickup_from: raise forms.validationerror('delivery dates cannot before pickup dates') return delivery_daterange
your problem you're not returning converted values.
delivery_daterange = self.cleaned_data['delivery_daterange'] [...] return delivery_daterange that returns same string, unparsed. instead:
def clean_delivery_daterange(self): [...] delivery_from = datetime.datetime.strptime(str_delivery_from, "%d %b %y") delivery_to = datetime.datetime.strptime(str_delivery_to, "%d %b %y") return (delivery_from, delivery_to) def clean_pickup_daterange(self): [...] pickup_from = datetime.datetime.strptime(str_pickup_from, "%d %b %y") pickp_to = datetime.datetime.strptime(str_pickup_to, "%d %b %y") return (pickup_from, pickup_to) and in view:
new_obj.date_pickup_from, new_obj.date_pickup_to = form.cleaned_data['pickup_daterange'] an alternate approach return text values, convert date objects in view:
def form_valid(self, form): new_obj = form.save(commit=false) pickup_start_string, pickup_end_string = form.cleaned_data['pickup_daterange'].split(' ') new_obj.date_pickup_from = strptime(pickup_start_string, "%d %b %y") #...etc a more advanced approach define custom field cover concept of date range, , define to_python method return, say, tuple of date objects.
personally, simplify whole thing , let date_pickup_from , rest datefield instances in form, maybe custom widget if wanted use jquery datepicker user pick dates, , take care of special rendering in template.
Comments
Post a Comment