Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django:管理中的模型继承和验证程序_Django - Fatal编程技术网

django:管理中的模型继承和验证程序

django:管理中的模型继承和验证程序,django,Django,我有一个由两个孩子继承的抽象模型。在子类中,一个是设置验证器。当我运行代码时,我看到两个孩子都有验证器 以下是伪代码: class myAbstract(models.Model): Intro = models.TextField(blank=True, null=True, ) class Meta: abstract = True class child1(myAbstract): class Meta: ver

我有一个由两个孩子继承的抽象模型。在子类中,一个是设置验证器。当我运行代码时,我看到两个孩子都有验证器

以下是伪代码:

class myAbstract(models.Model):
    Intro         = models.TextField(blank=True, null=True, )

    class Meta:
        abstract = True

class child1(myAbstract):
    class Meta:
         verbose_name = 'child 1'

class child2(myAbstract):
    def __init__(self, *args, **kwargs):
        super(child2, self).__init__(*args, **kwargs)

        intro = self._meta.get_field('Intro')
        intro.validators.append(MaxLengthValidator(60))

     class Meta:
         verbose_name = 'child 2'
在管理中,如果我添加一个child1,然后添加一个child2,那么验证器将对child2生效并限制字符数。如果我从child2开始,那么child2不会得到验证器

这是预期的行为吗?如果有,建议的编码方式是什么?我想把介绍移到儿童课上

已解决: 正如Alasdair指出的,验证器是一个类变量,因此这是预期的行为

我试着将介绍字段移到孩子身上,但没有成功。我使用了这个解决方案:

这在模型表单中设置了forms.CharField。

我真的没有想到会出现这种行为,但是在模型的背景中有很多神奇的事情发生。我看到两种解决方案:

  • 更改实例,而不是类_meta是一个类变量,因此_meta.get_字段将返回类属性。我宁愿尝试这样操作实例字段

    definit(…): self.intro.validators.append(MaxLengthValidator(60))

  • 如果1不起作用,或者您不喜欢它,请不要使用模型,也就是说,不要添加验证器,而是将添加到您用于模型的表单中。在那里你有更多的灵活性,可以做你想做的事


  • 不是每个模型实例都设置
    验证器。当您附加
    MaxLengthValidator
    时,您正在更改父类的
    intro
    字段


    我不认为有一个简单的方法来解决这个问题。您可以为每个子模型编写一个
    clean()
    方法,并在那里执行验证。但是,我认为将
    intro
    字段移动到子类中可能是最好的选择。

    在模型表单中设置验证器是一个好主意。但是第一个建议不起作用,因为
    self.intro
    是字段的值,因此没有
    validators
    属性。