これには、ある種の ajax ルックアップが必要になると思います。たとえば、javascript (jquery をお勧めします) は、誰かが郵便番号を入力するたびに ajax リクエストを実行するように設定されます。おそらく、zipcode テキスト ボックスの長さが 6 の場合、onChange イベントは URL "/ajax/get_region/60604/" を要求し、これが下のビューにマップされ、zipcode を渡します。ビューは、その郵便番号の地域を示す json 応答を返す場合があります。最後に、javascript コールバック関数で、サイトのダイアログ ボックスを更新して地域を示すことができます。
私のお勧めは、リージョンを Web サーバーにポストバックする必要さえないということです.... ここでの ajax ルックアップは表示目的でのみ使用され、POST 中に再度計算されます。しかし、繰り返しになりますが、ユーザーが地域と郵便番号の両方を手動で入力できるようにするかどうかはわかりません。
ビュー.py
import json
from django.http import HttpResponse
def ajax_region_from_zip(request, zip):
# do your logic to lookup the zipcode from the region
region, lookup_success = get_region_form_zip(zip)
response = Response(content_type='application/json')
response.write(json.dumps({"success":lookup_success, "region":region ))
return response
最後に、ユーザーがフォームで地域と郵便番号の両方を編集できるようにしたい場合は、地域と郵便番号が常に一致していることを確認し、ユーザーがフォームでチェックを作成することをお勧めします。提出します。また、ユーザーが JavaScript を無効にしている場合、ユーザーが間違った地域を選択した場合にエラーを表示する必要があります。郵便番号から地域を検索するフォームの clean() メソッドをオーバーライドすることもできます。フロントエンド フォームによって投稿された地域と一致しない場合は、エラー メッセージが返されます。
フォーム.py
class AddressForm(forms.ModelForm):
....
....
def clean(self):
cleaned_data = self.cleaned_data
zip = cleaned_data.get('zip', None)
region = cleaned_data.get('region', None)
region_lookup, lookup_success = get_region_form_zip(zip)
if not region == region_lookup:
forms.ValidationError("This zipcode is not in the given region.")
return cleaned_data
これらのコード例はテストされていませんが、アイデアが理解できることを願っています。
お役に立てれば、
ジョー