0

外部キーにリンクされた 3 つのモデルがあります。

class Region(models.Model):
    name = models.CharField(max_length=20)

class Zipcode(models.Model):
    zipcode =  models.IntegerField()
    name = models.CharField(max_length=20)
    region = models.ForeignKey(Region)

class Address(models.Model):
    street = models.Charfield(max_length=40)
    zipcode = models.ForeignKey(Zipcode)
    region = models.ForeignKey(Region)

次のステップでは、モデルに基づいてフォームを作成しましたAddress

regionユーザーがフィールドに入力すると、フィールドに自動的に入力したいと思いzipcodeます。

バックエンドなどで値を計算できることは知っていregionますが、ユーザーがフィールドを選択したときにほぼ「リアルタイム」でフィールドを完成させることは可能zipcodeですか? ユーザーのフォームにも表示されるようにするには?

ありがとう!

4

1 に答える 1

0

これには、ある種の 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 

これらのコード例はテストされていませんが、アイデアが理解できることを願っています。
お役に立てれば、

ジョー

于 2012-06-24T17:08:45.000 に答える