【问题标题】:Override min_value and max_value in IntegerField Django在 IntegerField Django 中覆盖 min_value 和 max_value
【发布时间】:2021-11-28 16:09:44
【问题描述】:
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 在班级C 中的范围为2 到20?

我在考虑两种方法:

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

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

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    最好将这些边界作为验证器添加到class Aclass B__init__ 方法中的边界。这将使这些对C 透明,此外C 可以为该名称定义另一个IntegerField,从而为此指定不同的小部件:

    from django.core import validators
    
    class A:
        number1 = IntegerField()
        
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            number1 = self.fields['number1']
            number1.validators.append(validators.MinValueValidator(self.min_v))
            number1.validators.append(validators.MaxValueValidator(self.max_v))
            number1.widget.attrs['min'] = number1.min_value = self.min_v
            number1.widget.attrs['max'] = number1.max_value = self.max_v
    
    class B(A):
        number2 = IntegerField()
        
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            number2 = self.field['number2']
            number2.validators.append(validators.MinValueValidator(self.min_v))
            number2.validators.append(validators.MaxValueValidator(self.max_v))
            number2.widget.attrs['min'] = number2.min_value = self.min_v
            number1.widget.attrs['max'] = number2.max_value = self.max_v

    【讨论】:

    • 想了想,没有传给widget attrs。
    • @AndrewFount:这就是为什么您需要附加验证器:Django 仅在您构造 表单字段时查看此内容。因此,这意味着如果您稍后设置.min_value.max_value,它将无法在后端正确验证。 .min_value.max_value 对于 前端 的边界是必需的,因为它们将用于 <input type="number" min="..." max="...">
    • 我的意思是,小部件属性也应该添加:number2.widget.attrs.update({'min': self.min_v, 'max': self.max_v})
    • @AndrewFount:是的。谢谢,已更新。
    猜你喜欢
    • 2020-05-30
    • 2020-03-16
    • 2011-03-29
    • 1970-01-01
    • 2021-05-08
    • 2016-10-06
    • 2011-09-24
    • 2011-09-21
    • 2019-01-01
    相关资源
    最近更新 更多