Saturday, May 26, 2012

Re: How to call RegexValidator explicitly?

Thanks! I put it in today and it worked fine.

On May 24, 2012, at 9:10 AM, bruno desthuilliers wrote:

> On May 24, 4:30 am, forthfan <forthfan5...@gmail.com> wrote:
>>
>> from django import forms
>> from django.core.validators import *
>>
>> class IdentForm(forms.Form):
>> ident = forms.CharField()
>> ident_type = forms.ChoiceField(choices=(
>> ('EIN','Employer ID'),
>> ('SSN','Social Security Number'),
>> ))
>>
>> TYPE_CHOICES = (
>> ('EIN','\d{2}-\d{7}'),
>> ('SSN','\d{3}-\d{2}-\d{4}'),
>> )
>>
>> def clean(self):
>> cleaned_data = super(IdentForm, self).clean()
>> ident = cleaned_data.get('ident')
>> ident_type = cleaned_data.get('ident_type')
>
> Don't assume you'll have values for both fields in cleaned_data - they
> may have failed validation already.
>
>
>> regexp = TYPE_CHOICES[ident_type]
>
> I assume you meant:
>
> regexp = self.TYPE_CHOICES[ident_type]
>
> but it wont work since TYPE_CHOICES is a list of tuples, not a dict,
> so this should be:
>
>
> regexp = dict(self.TYPE_CHOICES)[ident_type]
>
>> RegexValidator([regexp]) # What's missing?
>
> First, you have to get rid of the [] here - RegexpValidator expects
> either a string or compiled regexp as first argument.
>
> Then once you have a validator instance, you have to call it (like you
> would call a function)
>
>> # How do I pass ident to the validator?
>
> As argument to the call.
>
>> if ??????: # Do I test for existence of error message?
>
> Validators raise a django.core.exceptions.ValidationError
>
>> ident = ''
>> return cleaned_data
>
> Rebinding the 'indent' symbol in the current namespace won't change
> the value (if any) of cleaned_data['ident']. You want to modify
> cleaned_data itself (and either set the erreor message manually in
> either ident and/or ident_type fields errors or reraise the
> ValidationError)
>
> class IdentForm(forms.Form):
> ident = forms.CharField()
> ident_type = forms.ChoiceField(choices=(
> ('EIN','Employer ID'),
> ('SSN','Social Security Number'),
> ))
>
> TYPE_CHOICES = (
> ('EIN','\d{2}-\d{7}'),
> ('SSN','\d{3}-\d{2}-\d{4}'),
> )
>
> # no need to reinstanciate validators on each call, we can as well
> # do the job here once for all
> TYPE_VALIDATORS = dict((key, RegexpValidator(regexp)) for key, regexp
> in TYPE_CHOICES)
>
> def clean(self):
> cleaned_data = super(IdentForm, self).clean()
> ident = cleaned_data.get('ident', '')
> ident_type = cleaned_data.get('ident_type', '')
> if ident and ident_type:
> # we assume that ident_type is ok here - if not there's
> # a serious problem with forms.ChoiceField ;)
> validate = self.TYPE_VALIDATORS[ident_type]
> try:
> validate(ident)
> except ValidationError, e:
> # doing the simplest thing here, so the error will appear
> # in non-field errors. If you want to set the error on
> # the ident and/or ident_type field(s), cf the FineManual:
> # https://docs.djangoproject.com/en/1.3/ref/forms/validation/#described-later
> del self.cleaned_data['ident']
> raise
>
> return cleaned_data
>
> HTH
>
> --
> 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 django-users+unsubscribe@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
>

--
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 django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate