在Django模型中代表邮政地址的常见做法是什么?是否有自定义模型字段的库,其中包括邮政地址字段并可能处理验证和格式化?
如果没有库,我怎么写一个?我可以在django中表示复合字段(在db中被序列化为多个列的字段)吗?希望这消除了加入查询的需要。
答案 0 :(得分: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)
...
涉及更多代码,但在此处粘贴有点多。这些信息可以让你朝着正确的方向前进。
注意:截至2013年11月21日,localflavor已移至外部包裹(available on PyPi)。