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.