在 IntegerField Django 中覆盖 min_value 和 max_value
Override min_value and max_value in IntegerField Django
class A:
min_v = 1
max_v = 15
number1 = IntegerField(min_value=min_v, max_value=max_v)
class B(A):
number2 = IntegerField(min_value=A.min_v, max_value=A.max_v)
class C(B):
min_v = 2
max_v = 20
如何使number1
和number2
都在class中的2到20范围内 C
?
我在想两个办法:
- 在
__init__
中像 IntegerField(min_value=self.min_v)
一样重新声明 self.fields['number1']
- 在
__init__
中设置 self.fields['number1'].min_value=self.min_v
并覆盖 setattr()
以添加验证器。
最好最干净的方法是什么?
将这些边界作为验证器添加到 class A
和 class B
的 __init__
方法中的边界可能会更好。这将使这些对 C
透明,而且 C
可以例如为该名称定义另一个 IntegerField
,从而为此指定一个不同的小部件:
from django.core import <b>validators</b>
class A:
number1 = IntegerField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
number1 = self.fields['number1']
number1<strong>.validators.append(validators.MinValueValidator(self.min_v))</strong>
number1<strong>.validators.append(validators.MaxValueValidator(self.max_v))</strong>
number1.widget.attrs['min'] = number1<strong>.min_value = self.min_v</strong>
number1.widget.attrs['max'] = number1<strong>.max_value = self.max_v</strong>
class B(A):
number2 = IntegerField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
number2 = self.field['number2']
number2<strong>.validators.append(validators.MinValueValidator(self.min_v))</strong>
number2<strong>.validators.append(validators.MaxValueValidator(self.max_v))
number2.widget.attrs['min'] = number2<strong>.min_value = self.min_v</strong>
number1.widget.attrs['max'] = number2<strong>.max_value = self.max_v</strong></strong>
class A:
min_v = 1
max_v = 15
number1 = IntegerField(min_value=min_v, max_value=max_v)
class B(A):
number2 = IntegerField(min_value=A.min_v, max_value=A.max_v)
class C(B):
min_v = 2
max_v = 20
如何使number1
和number2
都在class中的2到20范围内 C
?
我在想两个办法:
- 在
__init__
中像IntegerField(min_value=self.min_v)
一样重新声明 - 在
__init__
中设置self.fields['number1'].min_value=self.min_v
并覆盖setattr()
以添加验证器。
self.fields['number1']
最好最干净的方法是什么?
将这些边界作为验证器添加到 class A
和 class B
的 __init__
方法中的边界可能会更好。这将使这些对 C
透明,而且 C
可以例如为该名称定义另一个 IntegerField
,从而为此指定一个不同的小部件:
from django.core import <b>validators</b>
class A:
number1 = IntegerField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
number1 = self.fields['number1']
number1<strong>.validators.append(validators.MinValueValidator(self.min_v))</strong>
number1<strong>.validators.append(validators.MaxValueValidator(self.max_v))</strong>
number1.widget.attrs['min'] = number1<strong>.min_value = self.min_v</strong>
number1.widget.attrs['max'] = number1<strong>.max_value = self.max_v</strong>
class B(A):
number2 = IntegerField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
number2 = self.field['number2']
number2<strong>.validators.append(validators.MinValueValidator(self.min_v))</strong>
number2<strong>.validators.append(validators.MaxValueValidator(self.max_v))
number2.widget.attrs['min'] = number2<strong>.min_value = self.min_v</strong>
number1.widget.attrs['max'] = number2<strong>.max_value = self.max_v</strong></strong>