【问题标题】:Force CharField's Choices强制 CharField 的选择
【发布时间】:2017-06-03 06:43:04
【问题描述】:

我的模型中有几个 models.CharField 对象,具有 choices 属性。

就 GUI 而言,这很好用,但我想阻止代码本身中 choices 属性中指定的值以外的值(以保护自己免受错误的影响)。

在尝试保存不在选择列表中的字符串时,有没有办法引发异常(我相信它会是 ValueError)?

【问题讨论】:

  • 为什么投反对票?请澄清这个问题有问题。

标签: django model django-orm


【解决方案1】:

你可以override the save method你的模型来引发你自己的异常:

class MyModel:

    MY_CHOICES = (
        # choices here
    )

    myfield = models.CharField(max_length=100, choices=MY_CHOICES)

    def save(self, *args, **kwargs):
        choice = self.myfield
        if not any(choice in _tuple for _tuple in self.MY_CHOICES):
            raise ValueError('An error message.')
        super(MyModel, self).save(*args, **kwargs)

【讨论】:

  • 刚刚看到这个相关的答案:stackoverflow.com/questions/9048108/…。根据 Fazil 的回答,clean() 方法似乎是表单验证的首选位置。此外,如果您在 clean() 中引发 ValidationError,它会自动将其添加到 form.non_field_errors 中(尽管如果使用 'choices' 属性和相关的表单小部件来限制选项,这不太相关)。
【解决方案2】:

您可以为此使用模型清理方法,

class YourModel(models.Model):
    CHOICES = ('your_choices_here',)

    def clean(self):
        if not any(self.field_name in item for item in self.CHOICES):
            raise ValueError("Your error message here.")

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2021-09-08
    • 2016-08-10
    • 1970-01-01
    • 2021-04-19
    • 2021-02-11
    • 2019-06-12
    • 2017-08-20
    相关资源
    最近更新 更多