规范化Django/Python中的街道地址

2024-04-29 08:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django表单,其中一个字段是街道地址的TextInput

我想把数据规范化。例如:

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

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

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

或者类似的事情。我已经在使用geopy进行地理编码。也许这会有帮助?

还有:我应该在哪里正常化?在数据库模型中还是在表单域的clean函数中?


Tags: 数据django表单street地址textinput规范化街道
3条回答

最可靠的方法是利用真实地址验证服务。它不仅将根据USPS标准(参见Publication 28)标准化(规范化)地址组件,而且还将确保地址是真实的。

完全公开:我为SmartyStreets工作,它提供了这样一个service。下面是一些非常简单的python示例代码,演示如何通过HTTP GET请求使用我们的服务:

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

我最近创建了一个street-addresspython模块,它的StreetAddressFormatter可用于规范化您的地址。

这就是我解决这个问题的方式(不是双关语):

### 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

开放征求意见/建议。

相关问题 更多 >