Re: How to automatically apply a method to all fields in newforms subclass?

2007-09-17 Thread Nimrod A. Abing

Just revisiting this thread...

On 9/14/07, Doug B <[EMAIL PROTECTED]> wrote:
>
> I think you can make a custom form field to do your validation check
> for you.
>
> def StrippedField(forms.CharField):
> def clean(self,value):
> #do your validation here

While the solution above would work and I have been using that as
well, I found that there were times that I needed to perform some
post-validation stuff on the field data. The fields would be of
different types but the post-validation operations would be the same.
I did not find it entirely appealing to have to create an entire set
of subclasses to do this, i.e.:

SpecialCharField(forms.CharField)
SpecialBooleanField(forms.BooleanField)
etc...

or the alternative way by using clean_FIELDNAME()

So I was looking for a more generic way of iterating through all or
selected fields and applying a method that modifies their contents.

After looking around a bit in ASPN, I decided to go with a method factory:

class StrippedFieldsForm(forms.Form):
stripped_fields = []
def __init__(self, *args, **kwargs):
super(StrippedFieldsForm, self).__init__(*args, **kwargs)
for name in self.fields:
setattr(StrippedFieldsForm, 'clean_%s' % name,
self.clean_field_factory(name))

def clean_field_factory(self, name):
def _strip_field(self):
field = self.fields[name]
label = self.fields[name].label or name
return self.strip_field(name, label + ' is empty.')
return _strip_field

def strip_field(self, field, error_message):
if (self.clean_data.get(field)):
data = self.clean_data[field].strip()
if (0 == len(data)):
raise forms.ValidationError(error_message)
else:
return data
else:
return ''

It looks like a lot of work to implement and seems sort of pointless
as I'm sure that the subclass way is preferred in most cases. But in
my case, I needed to be able to swap out strip_field() with something
else on a case-by-case basis. As always, am open to using a better
solution, but for the moment this works for me. Hope someone finds
this useful.
-- 
_nimrod_a_abing_

http://abing.gotdns.com/
http://www.preownedcar.com/

--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



How to automatically apply a method to all fields in newforms subclass?

2007-09-13 Thread Nimrod A. Abing

Hello,

I have several forms that I subclass from a subclass of newforms:

# newforms is aliased as forms
class StrippedFieldsForm(forms.Form)
def strip_field(self, field, error_message):
if (self.clean_data.get(field)):
data = self.clean_data[field].strip()
if (0 == len(data)):
raise forms.ValidationError(error_message)
else:
return data
else:
return ''

class DerivedForm(StrippedFieldsForm):
# ... fields go here ...

# ... for each field I have to do ...
def clean_field1(self):
return self.strip_field('field1', 'Field 1 contains only whitespace.')
def clean_field2(self):
return self.strip_field('field2', 'Field 2 contains only whitespace.')

This gets tedious as there are forms with 10 or more fields.

My question is, is there another way to apply strip_field to *all* or
a select list of fields automatically? My last resort is to override
form.clean() for StrippedFieldsForm.
-- 
_nimrod_a_abing_

http://abing.gotdns.com/
http://www.preownedcar.com/

--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



Re: How to automatically apply a method to all fields in newforms subclass?

2007-09-13 Thread Doug B

I think you can make a custom form field to do your validation check
for you.

def StrippedField(forms.CharField):
def clean(self,value):
#do your validation here


--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---