【问题标题】:How to add a custom validator in a subclass that validates a parent field in Django如何在验证 Django 中的父字段的子类中添加自定义验证器
【发布时间】:2012-05-27 19:06:39
【问题描述】:

在 Django 中,我有一个包含一些公共字段的父抽象类,以及一些添加更多字段的子类。在其中一些子类中,我想添加自定义验证器来验证父类上的字段。

class Template(models.Model):
  text = models.CharField(max_length=200)

class GlobalTemplate(Template):
  function = models.ManyToManyField(Function, null=True, blank=True)

我可以像这样轻松地将它们添加到父类的字段中:

class Template(models.Model):
  text = models.CharField(max_length=200, validators=[validate_custom])

但在这种情况下,我想将验证器添加到我的子类 GlobalTemplate 中,但将其附加到文本字段。

这在 Django 中可行吗?

谢谢!

【问题讨论】:

  • 让我看看我是否理解:您想在字段text 上放置一个自定义验证器,但只能在GlobalTemplate 子类中并且没有重新定义text。对吗?

标签: django


【解决方案1】:

字段验证器存储在field.validators,它是一个列表,所以你基本上需要在那里附加你的验证器。

要访问字段实例,您必须使用对象的_meta 属性(请注意,不应该使用此属性,所以当你更新 django,你必须检查它是否没有改变)。你可以这样做:

def get_fields_dict(self):
    return dict((field.name, field) for field in self._meta.fields)

def __init__(self, *args, **kwargs):
    super(GlobalTeplate, self).__init__(*args, **kwargs)
    text_field = self.get_fields_dict()['text']
    text_field.validators.append(validate_custom)

【讨论】:

  • 我会在哪里添加呢?我无法在 models.py 中为我的子类添加 text.validators = [calidate_custom],那么在哪里可以添加到子类的验证器列表中?
  • 您模型的__init__ 方法完全可以。不过不要忘记super 电话。
  • Hrm...也许我完全错过了一些基本的东西,但是尝试将self.text.validators = [validate_custom] 添加到 init 方法会给我一个“'unicode' object has no attribute 'validators'”错误跨度>
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2011-09-16
  • 2014-12-03
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多