Django 中表单和小部件的奇怪行为
Weird behaviour of form and widget in Django
我有以下简单的表单字段
class PhoneField(CharField):
widget = PhoneWidget
def clean(self, value):
value = re.sub('\D', '', super(PhoneField, self).clean(value))
if len(value) < 7:
raise ValidationError(_("Phone number is too short"), code='too_short')
return value
不过,小部件仍然是文本输入。
但是,如果我写
def __init__(self, *args, **kwargs):
kwargs['widget'] = PhoneWidget
super(PhoneField, self).__init__(*args, **kwargs)
然后就可以完美运行了。深入研究我注意到的代码,如果在 kwargs 中未指定小部件,则使用 self.widget,但事实并非如此。这是为什么?
请注意,我没有在代码中传递小部件。
field = PhoneField(label='Phone')
找到问题了。
问题出在管理员中。管理员传入 kwargs
CharField 的默认小部件 - widgets.AdminTextInputWidget
.
我有以下简单的表单字段
class PhoneField(CharField):
widget = PhoneWidget
def clean(self, value):
value = re.sub('\D', '', super(PhoneField, self).clean(value))
if len(value) < 7:
raise ValidationError(_("Phone number is too short"), code='too_short')
return value
不过,小部件仍然是文本输入。 但是,如果我写
def __init__(self, *args, **kwargs):
kwargs['widget'] = PhoneWidget
super(PhoneField, self).__init__(*args, **kwargs)
然后就可以完美运行了。深入研究我注意到的代码,如果在 kwargs 中未指定小部件,则使用 self.widget,但事实并非如此。这是为什么?
请注意,我没有在代码中传递小部件。
field = PhoneField(label='Phone')
找到问题了。
问题出在管理员中。管理员传入 kwargs
CharField 的默认小部件 - widgets.AdminTextInputWidget
.