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 <[email protected]> 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 [email protected]. > 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. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to [email protected]. 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.

