Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义Django字段的验证_Django_Validation_Django Models_Django Admin - Fatal编程技术网

自定义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_

有一个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_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
。可能我必须去掉子字段数据库(有例子吗?)