Django模型中的自定义地址字段

4 投票
1 回答
3719 浏览
提问于 2025-04-15 18:39

在Django模型中,表示邮政地址的常见做法是什么?有没有什么库可以用来创建自定义模型字段,包括邮政地址字段,并且能够处理验证和格式化?

如果没有这样的库,我该怎么写一个?我可以在Django中表示一个复合字段(一个可以序列化为数据库中多个列的字段)吗?希望这样能省去连接查询的麻烦。

1 个回答

6

我不知道有没有一个专门的表单字段可以用来填写地址,但你可以使用 localflavor 来验证输入的内容。同时,可以结合使用 MultiWidgetMultiValueField 来创建一个地址字段。我的代码大概是这样的:

class SplitAddressWidget(forms.MultiWidget):
    def __init__(self, attrs=None):     
        widgets = []
        widgets.append(forms.TextInput(attrs=attrs))
        widgets.append(forms.TextInput(attrs=attrs))
        widgets.append(forms.TextInput(attrs=attrs))
        widgets.append(forms.TextInput(attrs=attrs))
        widgets.append(forms.TextInput(attrs=attrs))
        super(SplitAddressWidget, self).__init__(widgets, attrs)
    ...

class SplitAddressField(forms.MultiValueField):
    widget = SplitAddressWidget
    def __init__(self, *args, **kwargs):
        fields = (
                forms.CharField(required=kwargs['required']),
                forms.CharField(required=0),    
                forms.CharField(required=kwargs['required']),
                USStateField(required=kwargs['required']),
                USZipCodeField(required=kwargs['required']),
            )
        super(SplitAddressField, self).__init__(fields, *args, **kwargs)
    ...

还有更多的代码,但这里贴出来有点多。以上信息应该能帮助你朝着正确的方向前进。

注意:从2013年11月21日起,localflavor 已经被移到一个外部包中(可以在PyPi上找到)。

撰写回答