繁体   English   中英

验证 Django 中的值列表

[英]Validating a list of values in Django

在我的 model 中,我有一个字段应该只包含值“A”、“B”和“C”。 这是否最适合在声明字段时使用choice参数?

如果我没有决定使用choice参数并想为其编写自定义验证逻辑,我将在哪里写这个——这会是在 model 的clean方法中吗? 我还看到clean_<fieldname>方法——这些方法有什么用,或者它们只适用于 forms? 我想在 model 中进行此验证,因为我没有使用表单。

class Action(models.Model):
    """
    Contains the logic for the visit
    """
    id = models.AutoField(primary_key=True)
    path = models.CharField(max_length=65535, null=False)
    to = models.IntegerField(null=False)

    def clean(self, **kwargs):
        """
        Custom clean method to do some validation
        """
        #Ensure that the 'to' is either 1,2 or 3.
        if self.to not in [0, 1, 2]:
            raise ValidationError("Invalid to value.")

当我进行验证时,我需要返回一些值吗? 当有人创建新记录时会调用我的方法方法吗?

(虽然我已经阅读了文档,但我仍然对此感到有些困惑。)

万分感谢。

如果您只希望它是“A”、“B”和“C”,那么您绝对应该使用 Django 的内置验证,而不是自己滚动验证。 请参阅标题为choices的部分中的https://docs.djangoproject.com/en/1.3/ref/models/fields/

简单来说:

class Action(models.Model):
    """
    Contains the logic for the visit
    """

    TO_CHOICES = (
        (0, 'Choice 0'),
        (1, 'Choice 1'),
        (2, 'Choice 2'),
    )
    id = models.AutoField(primary_key=True)
    path = models.CharField(max_length=65535, null=False)
    to = models.IntegerField(null=False, choices=TO_CHOICES)

在您给出的示例中,我将使用choice参数。 如果您将to字段的验证放在 clean 方法中,那么任何错误都将与操作实例相关联,而不是与to字段相关联。

如您所述, clean_<fieldname>方法适用于表单字段。 在 model 上,您可以定义验证器

这是一个将您的 clean 方法重写为验证器的示例。

from django.core.exceptions import ValidationError

def validate_to(value):
    """
    Ensure that the 'to' is either 1, 2 or 3.
    """
    if value not in [1, 2, 3]:
        raise ValidationError("Invalid 'to' value.")

class Action(models.Model):
    """
    Contains the logic for the visit
    """
    id = models.AutoField(primary_key=True)
    path = models.CharField(max_length=65535, null=False)
    to = models.IntegerField(null=False,validators=[validate_to])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM