自定义Django字段的验证
有一个Django字段类型用于存储自定义Django字段的验证,django,validation,django-models,django-admin,Django,Validation,Django Models,Django Admin,有一个Django字段类型用于存储MyType的值 from django.core.exceptions import ValidationError from django.db import models class MyTypeField(models.Field): __metaclass__ = models.SubfieldBase def db_type(self, connection): return "text" def to_
MyType
的值
from django.core.exceptions import ValidationError
from django.db import models
class MyTypeField(models.Field):
__metaclass__ = models.SubfieldBase
def db_type(self, connection):
return "text"
def to_python(self, value):
if isinstance(value, basestring):
try:
value = MyType.deserialize(value)
except ParseError, e:
raise ValidationError("Invalid format: "+str(e))
assert isinstance(value, MyType)
return value
def get_prep_value(self, value):
if not isinstance(value, MyType):
raise ValidationError("Not MyType")
return value.serialize()
我试图在模型的管理页面上使用这种类型的字段。如果用户在字段中输入有效值,一切都会正常工作。但是如果输入的值无效,则不会捕获ValidationError
(如果启用了调试,则会得到错误500或堆栈跟踪)
相反,我希望看到字段附近有一条消息“格式无效”(就像输入无效的日期或数字一样)。如何修改field类以在正确的位置获得验证错误。您需要在field类中创建一个
clean(self,value,model_instance)
方法,并在那里进行验证/引发错误。引用
如果使用子字段数据库,则使用
将在每次调用实例时调用
字段的值被指定为一个值。这
意味着无论何时
分配给字段,您需要
确保其具有正确的性能
数据类型,或处理任何
例外情况。
因此,在这一点上永远不会捕获ValidationError<当从数据库中填充模型的新实例时,也会调用code>to_python,该数据库位于表单验证上下文之外
因此,您必须确保
表单字段,用于表示您的
自定义字段执行任何输入
验证和数据清理非常重要
需要转换用户提供的
将表单输入到
to_python()-兼容模型字段
值。这可能需要写入
自定义表单字段,和/或实现
字段上的formfield()方法
返回其
to_python()返回正确的
数据类型
因此,您必须将验证移到formfield中。对于
子字段,不调用base
字段clean
。可能我必须去掉子字段数据库(有例子吗?)