gpt4 book ai didi

Django CreateView 和验证

转载 作者:行者123 更新时间:2023-12-03 09:43:46 28 4
gpt4 key购买 nike

我正在尝试在我的 Django 1.8 应用程序中实现通用 View ,以便 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 上的验证器会这样做。

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

最佳答案

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

更长的解释

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

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

关于Django CreateView 和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617115/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com