1つのオプションは、Geopyを使用してYahooやGoogleマップなどの誰かの住所を検索し、一致する住所の完全な住所を返すことです。返送された住所でアパート番号が切り捨てられるのを監視する必要がある場合があります(たとえば、「221 Amsterdam Av#330」が「221AMSTERDAM AVENUE」になります)。さらに、ユーザーが省略したり、スペルを間違えたりした可能性のある都市/州/国の情報も取得します。
複数の一致がある場合は、どのアドレスであるかについてのフィードバックをユーザーに求めることができます。一致しない場合は、有効なアドレスの重要性と、アドレス検索プロバイダーの有効性に対する信頼度に応じて、ユーザーに通知し、アドレスの保存を許可することもできます。
フォームとモデルでこの正規化を行うことに関して、私は物事を行うための好ましいDjangoの方法が何であるかわかりませんが、私の好みはフォームにあります。たとえば、次のようになります。
def clean(self):
# check address via some self-defined helper function
matches = my_helper_address_matcher(address, city, state, zip)
if not matches:
raise forms.ValidationError("Your address couldn't be found...")
elif len(matches) > 1:
# add javascript into error so the user can select
# the address that matches? maybe there is a cleaner way to do this
raise forms.ValidationError('Did you mean...')
他の領域で再利用したい場合は、このルックアップ関数をモデル(または一部のhelpers.pyファイル)にスローできます。