Django模型中的自定义地址字段
在Django模型中,表示邮政地址的常见做法是什么?有没有什么库可以用来创建自定义模型字段,包括邮政地址字段,并且能够处理验证和格式化?
如果没有这样的库,我该怎么写一个?我可以在Django中表示一个复合字段(一个可以序列化为数据库中多个列的字段)吗?希望这样能省去连接查询的麻烦。
1 个回答
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 已经被移到一个外部包中(可以在PyPi上找到)。