@ Nader : i think you got it, just give it a try! if it doesnt work
django will tell you anyway ;) You define a function that gets called
on validation of the field is the very abstract view of it as i
understand it.
On Oct 10, 6:34 pm, Tim Chase <[EMAIL PROTECTED]> wrote:
> > class Property(models.Model):
> > def isValidUKPostcode(self, field_data):
> > p = re.compile(r'^(GIR
> > 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|
> > [0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW]) [0-9][ABD-HJLNP-UW-Z]{2})$')
> > if not p.match(field_data['postcode']):
> > raise validators.ValidationError("You have to have a
> > space in the
> > Postcode and all Capital letters.")
>
> <rant>
>
> I'm gonna raise a personal pet-peeve here...if the computer can
> reformat/clean the incoming value, it should do so. Unless the
> space has specific syntactic value, you should normalize
> everything to an uppercase format with no spaces, and /then/
> validate it. Or allow your validation to accept a sloppy value
> and then normalize it before you save.
>
> Either way, there's very little more user-abusive than requiring
> them to enter such things (phone numbers, ID numbers, credit-card
> numbers, etc) in an exact format. PARTICULARLY when spaces are
> involved. I had one site require that a US phone# be formatted
> as "(999) 999-9999". I had to type the bloody parens, the dash,
> AND THE [expletive] SPACE before the form validated.
>
> On the other end of the spectrum, our VoIP system's web portal
> allows phone numbers to be entered in such a flexible number of
> ways that as long as I use numbers, it takes it. With any
> mixture of dashes, periods, parens, spaces, or none of the above,
> it normalizes it into an internal format, and then displays it in
> a uniform fashion.
>
> </rant>
I agree with that! And i will probably make it better. Still
learning ;)
>
> My understanding of the "right/Django" way to do this using
> newforms is to use the clean_* methods to normalize this data
> before it gets shoved off to the DB, and that these clean_*
> methods would look something like
>
> clean_postcode_re = re.compile('[^0-9a-z]', re.I)
> def clean_postcode(self):
> return clean_postcode_re.sub('',self.postcode).upper()
>
do you need to do clean in the admin as well?
o
> However, this seems to do it on a (newform)Field-by-field basis.
> I couldn't find much in the way of affixing such functionality
> to a Model field. The best I've been able to determine, one uses
> a custom model field as decribed here:
>
> http://www.djangoproject.com/documentation/model-api/#custom-field-types
>
> with it's caveat about "read the source and if it breaks, you get
> to keep both pieces". One would then override the
> get_db_prep_save() method to take the raw value and return the
> reformated/cleaned version (such as stripping out non-digit
> characters from a phone-number field).
>
> Is there an analog function for formatting things coming *out* of
> the DB? Using the phonenumber example, one might want to use the
> get_db_prep_save() to strip out anything non-numeric, and then
> store that form in the DB, but then when getting the field,
> display it as a formatted number. E.g:
>
> "800.555.1212" from the user
> -> "8005551212" in the DB
> -> "(800)555-1212" coming back out from the DB
>
> -tim
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---