Question: I have a Django form where one of the fields is a `TextInput` for a street address.

I want to normalize the data. For example:

```
>> normalize('420 East 24th St.')
'420 E. 24th Street'

>> normalize('221 Amsterdam Av')
'221 Amsterdam Ave.'

>> normalize('221 Amsterdam Avenue')
'221 Amsterdam Ave.'

```

Or something like that. I'm already using [geopy](http://code.google.com/p/geopy/) for geocoding. Perhaps this might help?

Also: Where should I normalize? In the database model or in the clean function of the form field?

Answer: 
The most reliable way to do this is to utilize a bona-fide address verification service. Not only will it standardize (normalize) the address components according to USPS standards (see [Publication 28](http://pe.usps.com/cpim/ftp/pubs/pub28/pub28.pdf)) but you will also be certain that the address is real. 

Full disclosure: I work for SmartyStreets, which provides just such a [service](http://www.smartystreets.com/products/liveaddress-api). Here's some really simple python sample code that shows how to use our service via an HTTP GET request:

<https://github.com/smartystreets/LiveAddressSamples/blob/master/python/street-address.py>
I have recently created a [street-address](https://github.com/pnpnpn/street-address) python module, and its StreetAddressFormatter can be used to normalize your address.