【问题标题】:Custom Form Field in DjangoDjango中的自定义表单字段
【发布时间】:2013-06-17 02:18:00
【问题描述】:

我正在尝试在 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 has no attribute empty_values。这与内置 TypedMultipleChoiceField 中的 Django 代码完全相同。所以我不明白为什么我会收到这个错误。 我也想过对TypedMultipleChoiceField 进行子类化,但是我希望它的错误在to_python 方法中有所不同,并且不想返回值的东西,所以选择了这种方法。 请帮帮我。

【问题讨论】:

  • 你使用的是哪个 Django 版本?
  • Django 1.5.1 是我正在使用的版本。这有什么关系?

标签: django django-forms django-models


【解决方案1】:

我不知道这是拼写错误还是您打算这样做,但实际上empty_values(复数形式)并未在您的代码中的任何地方定义。我也看了一下超类MultipleChoiceField的源码,里面也没有定义。

我能在你们班的超超班 (ChoiceField) 中找到对validator.EMPTY_VALUES 的引用,当然,它是大写字母。

源代码中与您更相似的是这一行:

if value == self.empty_value or value in validators.EMPTY_VALUES:

深入了解您的代码,看看您是否打算这样做。

希望这会有所帮助!

【讨论】:

  • 正如我在问题中提到的那样,我不打算改变它。只是想更改错误部分。我已经看到了代码,他们还以相同的方式创建了键入的多项选择字段。他们没有收到错误,为什么我会收到一个错误?
  • 看来你的代码是对的。我建议你用 pdb 做一些调试,看看实际发生了什么。
猜你喜欢
  • 2014-01-12
  • 2017-12-17
  • 2015-09-14
  • 2011-12-02
  • 2021-06-07
  • 2012-12-11
  • 2015-06-13
  • 2011-10-18
  • 2022-11-11
相关资源
最近更新 更多