【发布时间】: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_value 和max_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 documentation,min_value 参数是预期的,所以我不知道这个错误的真正含义。
我以为我理解了字段解构器的原理(从kwargs 中删除那些在子类的__init__ 中定义它们时不需要作为输入的东西)但也许不是。
我在使用min_value 和max_value 时有什么问题?
【问题讨论】:
-
参数是
minum和maximum,不是min_value和max_value。 -
docs:“采用两个可选参数进行验证,max_value 和 min_value。它们控制字段中允许的值的范围。”
标签: python django django-models django-forms