8

TextInputフィールドの1つが番地用のDjangoフォームがあります。

データを正規化したい。例えば:

>> normalize('420 East 24th St.')
'420 E. 24th Street'

>> normalize('221 Amsterdam Av')
'221 Amsterdam Ave.'

>> normalize('221 Amsterdam Avenue')
'221 Amsterdam Ave.'

またはそのようなもの。私はすでにジオコーディングにgeopyを使用しています。おそらくこれは役立つかもしれませんか?

また:どこで正規化する必要がありますか?データベースモデルまたはフォームフィールドのクリーン機能で?

4

4 に答える 4

4

これが私がこれに対処することになった方法です(しゃれは意図されていません):

### models.py ###

def normalize_address_for_display(address):

    display_address = string.capwords(address)

    # Normalize Avenue
    display_address = re.sub(r'\b(Avenue|Ave.)\b', 'Ave', display_address)

    # Normalize Street
    display_address = re.sub(r'\b(Street|St.)\b', 'St', display_address)

    # ...and other rules...

    return display_address

class Store(models.Model):

    name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)
    city = models.CharField(max_length=32)
    state = models.CharField(max_length=2)
    zipcode = models.CharField(max_length=5)

    @property
    def display_address(self):
        return normalize_address_for_display(self.address)

次にPlace.display_address、テンプレートで使用します。これにより、元のユーザーが送信したデータを変更せずにデータベースに保持しdisplay_address、正規化された表示バージョンが必要な場合にのみ使用できます。

コメント/提案のために開いてください。

于 2011-02-07T04:51:15.020 に答える
4

これを行う最も信頼できる方法は、誠実な住所確認サービスを利用することです。USPS標準( Publication 28を参照)に従って住所コンポーネントを標準化(正規化)するだけでなく、住所が本物であることも確認できます。

完全開示:私はまさにそのようなサービスを提供するSmartyStreetsで働いています。HTTPGETリクエストを介してサービスを使用する方法を示す非常に単純なPythonサンプルコードを次に示します。

https://github.com/smartystreets/LiveAddressSamples/blob/master/python/street-address.py

于 2011-10-26T14:32:36.350 に答える
4

最近、street-address pythonモジュールを作成しました。そのStreetAddressFormatterを使用して、住所を正規化できます。

于 2012-11-27T19:06:25.733 に答える
2

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ファイル)にスローできます。

于 2011-01-29T18:41:34.173 に答える