Одним из вариантов может быть использование Geopy для поиска адреса на таком человеке, как Yahoo или Google Maps, который затем будет возвращать полный адрес того (-ых), с которым он совпадает.Возможно, вам придется следить за тем, чтобы номера квартир были обрезаны по возвращенному адресу (например, «221 Amsterdam Av # 330» становится «221 AMSTERDAM 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) на случай, если вы захотите использовать ее в других областях