在 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

如何使number1number2都在class中的2到20范围内 C?

我在想两个办法:

  1. __init__ 中像 IntegerField(min_value=self.min_v)
  2. 一样重新声明 self.fields['number1']
  3. __init__ 中设置 self.fields['number1'].min_value=self.min_v 并覆盖 setattr() 以添加验证器。

最好最干净的方法是什么?

将这些边界作为验证器添加到 class Aclass 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>