Django,为ModelChoiceField编写干净方法的指南

Django,为ModelChoiceField编写干净方法的指南,django,django-forms,django-validation,Django,Django Forms,Django Validation,我已经阅读了文档,我只能找到关于如何在表单中为字段编写干净方法的指南: 但是,我创建了一个从modelcooicefield继承的字段。我希望添加一些自定义验证和清理,附加到字段和而不是表单,因为该字段用于多种表单,因此保持干燥 我可以尝试创建一个干净的方法,但是文档中似乎缺少传入的参数和应该返回的参数,或者我找不到 这里是我希望添加自定义清理和验证的字段: class FooChoiceField(forms.ModelChoiceField): 定义初始化(self,required=Tru

我已经阅读了文档,我只能找到关于如何在表单中为字段编写干净方法的指南:

但是,我创建了一个从
modelcooicefield
继承的字段。我希望添加一些自定义验证和清理,附加到字段和而不是表单,因为该字段用于多种表单,因此保持干燥

我可以尝试创建一个干净的方法,但是文档中似乎缺少传入的参数和应该返回的参数,或者我找不到

这里是我希望添加自定义清理和验证的字段:

class FooChoiceField(forms.ModelChoiceField):
定义初始化(self,required=True):
queryset=Foo.objects.filter(enabled=True)。按('name')排序
超级()。\uuu初始化__(
widget=forms.RadioSelect,
queryset=queryset,
到_field_name='id',#单选按钮值字段
必需的=必需的,
空标签=无,
)
self.error\u消息={
“必需”:“请选择一个Foo。”,
“无效的_选择”:“选择的Foo无效,请重试。”,
}
#将整个DB对象传递到模板中,以便可以访问所有字段
def标签来自_实例(self,obj):
返回obj
这里有一个猜测,尽管它被调用,但清理后的字段总是以
结尾,即使它是有效的:

class FooChoiceField(forms.ModelChoiceField):
...
def清洁(自身,值):
如果值!='正确':
raise ValidationError(“值的正确性受到质疑”)
返回值
def验证(自身、obj):
如果obj.foo!='福:
引发ValidationError(“foo上的验证错误”)

如果这是一个模型字段,并且重复使用验证,则应在模型本身上移动验证

def validate_correct(value):
    if value != 'correct':
        raise ValidationError("!",  code='incorrect')


class MyModel(models.Model):
    my_field = models.CharField(
        max_length=31,
        validators=[validate_correct],
    )
如果您想保留新的表单字段,还应该添加一些验证器

class MyModelChoiceFields(forms.ModelChoiceField):
    default_validators = [validate_correct]
    default_error_messages = {'incorrect': "This is not correct"}

自定义clean方法不应该在管理员网站上运行,只能在我拥有的一些表单上运行,因此在我的情况下,它不适用于在模型上放置clean/验证代码。