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

时间:2010-01-29 21:22:54

标签: python django django-models field

在Django模型中代表邮政地址的常见做法是什么?是否有自定义模型字段的库,其中包括邮政地址字段并可能处理验证和格式化?

如果没有库,我怎么写一个?我可以在django中表示复合字段(在db中被序列化为多个列的字段)吗?希望这消除了加入查询的需要。

1 个答案:

答案 0 :(得分: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已移至外部包裹(available on PyPi)。