Package: django-postal
django-postal(Based uponhttp://github.com/mthornhill/django-postal)WarningThis project is in ALPHA mode and the API is in flux.A django application that provides a location agnostic model for postal addresses.The motivation behind this project is that most countries have different forms of
postal addresses e.g.http://www.bitboost.com/ref/international-address-formats.html,http://en.wikipedia.org/wiki/Address_%28geography%29This app assumes that all postal addresses worldwide can be made up of 5 optional
address lines plus a country code.It then localizes the title of each line dependant on the country selected.
Further information on each address line can be gleaned fromdjango.contrib.localflavorfields and widgets e.g. for the UKfrom django import forms
from django.utils.translation import ugettext_lazy as _
from django.contrib.localflavor.uk.forms import UKPostcodeField, UKCountySelect

from postal.forms import PostalAddressForm

class GBPostalAddressForm(PostalAddressForm):
    line1 = forms.CharField(label=_(u"Street"), required=False, max_length=50)
    line2 = forms.CharField(label=_(u"Area"), max_length=50)
    city = forms.CharField(label=_(u"Town"), max_length=50)
    state = forms.CharField(label=_(u"County"), widget=UKCountySelect, max_length=50)
    code = UKPostcodeField(label=_(u"Postcode"))It is hoped that various contributors will contribute address formats per country
and that eventually this address information could find it’s way back in to
django.contrib.localflavorDependenciesdjango-countries (http://pypi.python.org/pypi/django-countries)Usage1. Add django-countries and django-postal to yourINSTALLED_APPSinsettings.pye.g.:INSTALLED_APPS = (
    "countries",
    "postal",
    ...
    )Add apostal_formto your templates:some_template.html
{% load postal_tags %}
<html>
    <head>
        <script src="{{ MEDIA_URL }}js/jquery-1.4.2.min.js" type="text/javascript" charset="utf-8"></script>
    </head>
<body>
    <form method="POST" action="">
        {% csrf_token %}
        {{form.as_p}}
        {% monitor_country_change %}
        <script type="text/javascript">
            $('form').monitor_country_change('#id_country');
        </script>
        <input type="submit"/>
    </form>
</body>
</html>Changing the country in the form above should localise the address form.In your view code add code to save the addressform e.g.:from postal.forms import PostalAddressForm

def my_view(request)
    if request.method == "POST":
        address_form = PostalAddressForm(request.POST, prefix=request.POST.get('prefix', ''))
        address_form.save()How to use localised addressesAddress localisation is turned on by default. To turn off Address l10n insettings.pyset:POSTAL_ADDRESS_L10N = FalseCustomize address labels and requirementIf you wish to customize the address labels and whether the address line is
required or not, you can add the following variables to settings.py:POSTAL_ADDRESS_LINE1, POSTAL_ADDRESS_LINE2, POSTAL_ADDRESS_CITY, POSTAL_ADDRESS_STATE, POSTAL_ADDRESS_CODEEach of these variables is set to a tuple of the format('label', True/False)labelis used to label the field, and the second boolean value sets whether
the field is required or not, e.g.:POSTAL_ADDRESS_LINE1 = ("Department", True)BUILD HISTORY0.9.6
Remove django-piston requirement
Fixed django 1.7 compatibility issues
Added Italian Postal Address Form
(Thanks to Francesco Facconi for above changes)0.7.2
Major refactor where all models removed so django-postal just provides localized forms.
It is up to the supporting project to define their own address models0.4
Don’t enforce uniqueness on postal addressesDevelopers, How to ContributeGit foo:$ git clone git@github.com:mthornhill/django-postal.git
$ cd django-postal
$ virtualenv . --no-site-packages
$ source bin/activate
$ python bootstrap.py
$ bin/buildout -v
$ bin/django syncdb
$ bin/django test postal
$ bin/django runserverBrowse tohttp://localhost:8000New countries can be added to thesrc/postal/formsfolder by their
2 letter country code e.g.usEach country folder contains an__init__.pyand aforms.pyforms.pycontains the localized address.