我正在尝试在Django中创建自定义表单字段。
class CustomTypedMultipleChoiceField(MultipleChoiceField):
def __init__(self, *args, **kwargs):
self.coerce = kwargs.pop('coerce', lambda val: val)
self.empty_value = kwargs.pop('empty_value', [])
super(CustomTypedMultipleChoiceField, self).__init__(*args, **kwargs)
def to_python(self, value):
"""
Validates that the values are in self.choices and can be coerced to the
right type.
"""
value = super(CustomTypedMultipleChoiceField, self).to_python(value)
if value == self.empty_value or value in self.empty_values:
return self.empty_value
new_value = []
for choice in value:
try:
new_value.append(self.coerce(choice))
except (ValueError, TypeError, ValidationError):
raise ValidationError(self.error_messages['invalid_choice'] % {'value': choice})
return new_value
def validate(self, value):
if value != self.empty_value:
super(CustomTypedMultipleChoiceField, self).validate(value)
elif self.required:
raise ValidationError(self.error_messages['required'])
我收到错误CustomTypedMultipleChoiceField
没有属性empty_values
。这与构建的TypedMultipleChoiceField
中的Django完全相同。所以我不明白为什么我会收到这个错误。
我还想过对TypedMultipleChoiceField
进行子类化,但我希望它的错误在to_python
方法中有所不同,并且不想返回值的东西,所以选择了这个方法。
请帮帮我。
答案 0 :(得分:1)
我不知道这是一个错字还是你打算这样,但实际上empty_values
(复数形式)在你的代码中没有定义。我还看一下超类MultipleChoiceField
的源代码,并没有在那里定义。
我在班级的超级超级班(ChoiceField
)中找到的是对validator.EMPTY_VALUES
的引用,当然还有大写字母。
源代码中与您更相似的一行是:
if value == self.empty_value or value in validators.EMPTY_VALUES:
深入了解您的代码,看看这是否是您打算做的。
希望这有帮助!