【问题标题】:FloatField __init__ got an unexpected keyword argument 'max_value'FloatField __init__ 有一个意外的关键字参数“max_value”
【发布时间】:2018-06-20 17:21:23
【问题描述】:

我最近询问了this question,并按照最初的说明解决了我的问题。以下代码有效:

class FloatRangeField (FloatField):
    """A FloatField constrained to a given range."""

    def __init__ (self, minimum, maximum, **kwargs):

        minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]

        self.minimum = minimum
        self.maximum = maximum

        kwargs ['validators'] = minmax

        FloatField.__init__ (self, **kwargs)

    def deconstruct (self):
        name, path, args, kwargs = super () .deconstruct ()

        kwargs ['minimum'] = self.minimum
        kwargs ['maximum'] = self.maximum

        del kwargs ['validators']

        return name, path, args, kwargs



class AffinityField (FloatRangeField):
    """An affinity is a float from -1 (hate) to +1 (love)."""

    def __init__ (self, **kwargs):
        FloatRangeField.__init__ (self, -1.0, 1.0, **kwargs)

    def deconstruct (self):
        name, path, args, kwargs = super () .deconstruct ()

        del kwargs ['minimum']
        del kwargs ['maximum']

        return name, path, args, kwargs

但是,我认为这还不够完整。我是 Django 新手,但我的理解是添加验证器会限制模型愿意保存的数据,但与此分开,如 this answer indicates,在表单级别进行验证。

如果您需要对表单级别进行限制,您可以将 min_value 和 max_value 传递给表单字段:

myfloat = forms.FloatField(min_value=0.0, max_value=1.0)

我还没有任何可见的表格(刚开始学习!)所以我不知道是否有必要单独执行此操作,但从它的声音我确实有传递min_valuemax_value 以及验证器对象。这是我的尝试:

class FloatRangeField (FloatField):
    """A FloatField constrained to a given range."""

    def __init__ (self, minimum, maximum, **kwargs):

        minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]

        self.minimum = minimum
        self.maximum = maximum

        # Validators for the model
        kwargs ['validators'] = minmax

        # Arguments for the form validation
        kwargs ['min_value']  = minimum
        kwargs ['max_value']  = maximum

        FloatField.__init__ (self, **kwargs)

    def deconstruct (self):
        name, path, args, kwargs = super () .deconstruct ()

        kwargs ['minimum'] = self.minimum
        kwargs ['maximum'] = self.maximum

        del kwargs ['validators']
        del kwargs ['min_value']
        del kwargs ['max_value']

        return name, path, args, kwargs

这会引发异常:

    FloatField.__init__ (self, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'min_value'

但是according to the documentationmin_value 参数预期的,所以我不知道这个错误的真正含义。

我以为我理解了字段解构器的原理(从kwargs 中删除那些在子类的__init__ 中定义它们时不需要作为输入的东西)但也许不是。

我在使用min_valuemax_value 时有什么问题?

【问题讨论】:

  • 参数是minummaximum,不是min_valuemax_value
  • docs:“采用两个可选参数进行验证,max_value 和 min_value。它们控制字段中允许的值的范围。”

标签: python django django-models django-forms


【解决方案1】:

看起来你混合了form fieldsmodel fields。您在问题中提供的链接描述了表格的FloatField

但您尝试自定义的模型FloatField 默认没有min_valuemax_value 参数。

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2019-01-05
    • 2021-10-29
    • 2014-09-14
    • 2015-01-27
    • 2016-08-25
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多