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

not*_*oop 4 python django field django-models

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

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

Jac*_* M. 6

我不知道地址的单个表单字段,但您可以localflavor用来验证输入和组合MultiWidget以及MultiValueField创建地址字段.我看起来像这样:

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)
    ...
Run Code Online (Sandbox Code Playgroud)

涉及的代码更多,但在此处粘贴有点多.这个信息应该让你朝着正确的方向前进.

注意:截至2013年11月21日,localflavor已移至外部包(可在PyPi上获得).