【问题标题】:Django CreateView and validationDjango CreateView 和验证
【发布时间】:2015-08-17 11:41:34
【问题描述】:

我正在尝试在我的 Django 1.8 应用程序中实现通用视图,以便 Django 可以为我处理验证/重定向循环。

我已经创建了一个模型:

class Customer(models.Model):
    custid = models.CharField(max_length=4, verbose_name='CID (4 alphanumeric uppercase)', validators=[validators.CIDValidator])
    customer_shortcode = models.CharField(max_length=7, verbose_name='Customer Code (7 chars, uppercase, no spaces)', validators=[validators.ShortnameValidator])
    description = models.CharField(max_length=30, blank=True)

并为我的两个验证字段中的每一个定义了一个验证器:

class CIDValidator(RegexValidator):
    regex = r'^[A-Z0-9]{4}$'
    message = 'CID is a 4-character uppercase alphanumeric value'

class ShortnameValidator(RegexValidator):
    regex = r'^[A-Z0-9_]{1,7}$'
    message = 'Shortname should be uppercase, no spaces, alphanumeric'

(此时,我预计管理界面会在我添加客户时使用验证器,但事实并非如此)

对于实际应用,我为 Customer 类创建了一个 ModelForm:

class CustomerForm(ModelForm):

    class Meta:
            model = Customer
            fields = ['custid', 'customer_shortcode', 'description']

还有一个继承自 CreateView 的 View 类:

class CustomerCreateView(CreateView):
    model = Customer
    form_class = CustomerForm

    def get_success_url(self):
        return reverse('customer_list')

当我在生成的表单中输入无效数据时,我仍然没有收到验证错误。

据我所知,我应该只需要覆盖 ModelForm 上的 clean() 或 clean_xxx() 以进行附加验证,而不是为此,但它真的不清楚。我想在尽可能少的地方保留关于什么构成有效值的知识——ModelField 上的验证器会这样做。

这里缺少什么?我怀疑我在模型验证和表单验证之间感到困惑......

【问题讨论】:

标签: django validation


【解决方案1】:

TL;DR:在模型字段定义中指定此类验证器时,您应该传递实例而不是类(validators.CIDValidator() 而不是 validators.CIDValidator)。

更长的解释

Django 验证器need to be callables。尝试调用您现在传递的类将通过 python 的实例创建序列,调用 __new____init__,它会返回该类的实例 - 但它不会在验证字段值。

您子类化的 Django 验证器也有一个 __call__ 方法,当您尝试调用该类的实例时运行该方法,它负责验证和提升 ValidationErrors

【讨论】:

  • 谢谢您,先生! CBV 和管理员现在都在验证。
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2018-02-08
  • 2012-03-09
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2016-07-30
相关资源
最近更新 更多