Hi,

Any idea if newforms simplifies this?

Regards,
Andres

On 9/29/06, DavidA <[EMAIL PROTECTED]> wrote:

> I also ran into this problem so I did it that hard way: I created a
> custom model DateField and a custom form DateField. (I call them
> RelaxedModelDateField and RelaxedFormDateField meaning they are relaxed
> about what format you put the date in). Every time I look at this code
> I think "this is way too complicated to simply allow different date
> formats on input/output" which is probably one of the reasons the
> forms/manipulators/validators are all getting revisited right now.
>
> To use this, just use RelaxedModelDateField in place of
> models.DateField in your model. This works in the admin.
>
> class RelaxedModelDateField(models.DateField):
>    """A DateField that supports various date formats
>    rather than just yyyy-mm-dd. The following formats
>    are allowed:
>      m/-d/-yyyy    6-23-2006
>      m/-d/-yy      6/23/06
>      m/-d          6/23
>      yyyy-mm-dd    2006-6-23
>      yyyymmdd      20060623
>
>    In the UI, the date will be displayed as mm/dd/yyyy"""
>    def __init__(self, verbose_name=None, name=None,
>                 auto_now=False, auto_now_add=False, **kwargs):
>        models.DateField.__init__(self, verbose_name, name,
>                                  auto_now, auto_now_add, **kwargs)
>
>    def get_internal_type(self):
>        return "DateField"
>
>    def to_python(self, value):
>        if isinstance(value, datetime.datetime):
>            return value.date()
>        if isinstance(value, datetime.date):
>            return value
>        try:
>            return toDateRelaxed(value)
>        except ValueError:
>            raise validators.ValidationError, gettext('Enter a valid
> date.')
>
>    def get_manipulator_field_objs(self):
>        return [RelaxedFormDateField]
>
>    def flatten_data(self, follow, obj = None):
>        val = self._get_val_from_obj(obj)
>        return {self.attname:
>                (val is not None and val.strftime("%m/%d/%Y") or '')}
>
> class RelaxedFormDateField(forms.DateField):
>    """A version of forms.DateField that automatically
>    supports various formats of dates."""
>    def __init__(self, field_name, is_required=False,
> validator_list=None):
>        forms.DateField.__init__(self, field_name, is_required,
> validator_list)
>
>    def isValidDate(self, field_data, all_data):
>        try:
>            toDateRelaxed(field_data)
>        except ValueError:
>            raise validators.CriticalValidationError, 'Enter a valid
> date.'
>
>    def html2python(data):
>        "Converts the field into a datetime.date object"
>        try:
>            return toDateRelaxed(data)
>        except ValueError:
>            return None
>    html2python = staticmethod(html2python)
>
>
> And here is the routine that actually does the "relaxed" parsing:
>
> # handle many formats:
> # m/-d/-yyyy    6-23-2006
> # m/-d/-yy      6/23/06
> # m/-d          6/23
> # yyyy-mm-dd    2006-6-23
> # yyyymmdd      20060623
> def toDateRelaxed(s):
>    exps = (r'^(?P<m>\d{1,2})[/-](?P<d>\d{1,2})[/-](?P<y>\d{4})$',
>            r'^(?P<m>\d{1,2})[/-](?P<d>\d{1,2})[/-](?P<y>\d{2})$',
>            r'^(?P<m>\d{1,2})[/-](?P<d>\d{1,2})$',
>            r'^(?P<y>\d{4})-(?P<m>\d{1,2})-(?P<d>\d{1,2})$',
>            r'^(?P<y>\d{4})(?P<m>\d{2})(?P<d>\d{2})$')
>    for exp in exps:
>        m = re.match(exp, s)
>        if m:
>            mm = int(m.group('m'))
>            dd = int(m.group('d'))
>            try:
>                yy = int(m.group('y'))
>                if yy < 100:
>                    yy += 2000
>            except IndexError:
>                yy = datetime.date.today().year
>            return datetime.date(yy, mm, dd)
>    raise ValueError, s
>
> Hope this helps...
> -Dave
>

--~--~---------~--~----~------------~-------~--~----~
 You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to