django - Django,为 ModelChoiceField 编写干净方法的指南
问题描述
我已阅读文档,但只能找到有关如何为表单中的字段编写干净方法的指南:https ://docs.djangoproject.com/en/3.1/ref/forms/validation/#cleaning-a-特定字段属性
但是我创建了一个继承自ModelChoiceField
. 我希望添加一些自定义验证和清理,附加到字段而不是表单,因为该字段用于多种表单,因此保持干燥。
我可以尝试创建一个干净的方法,但实际上传递了什么参数,应该返回什么似乎在文档中缺少,或者我找不到它。
这是我希望添加自定义清理和验证的字段:
class FooChoiceField(forms.ModelChoiceField):
def __init__(self, required=True):
queryset = Foo.objects.filter(enabled=True).order_by('name')
super().__init__(
widget=forms.RadioSelect,
queryset=queryset,
to_field_name='id', # The radio button value field
required=required,
empty_label=None,
)
self.error_messages = {
'required': "Please select a Foo.",
'invalid_choice': "Invalid Foo selected, please try again.",
}
# Pass the whole DB object into the template so one can access all fields
def label_from_instance(self, obj):
return obj
这是一个猜测,虽然它被调用,但清理后的字段总是以 结尾None
,即使它有效:
class FooChoiceField(forms.ModelChoiceField):
...
def clean(self, value):
if value != 'correct':
raise ValidationError("Value is challenged in it's correctness")
return value
def validate(self, obj):
if obj.foo != 'foo':
raise ValidationError("Validation Error on 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"}
推荐阅读
- spring-boot - Spring Boot Caching 仅使用 NoOp 缓存而不是配置的缓存类型
- python - 当我对消息做出反应时,机器人不想添加角色
- angular - Angular Material - 垫表排序行
- react-native - assembleRelease 仅在 react-native 包首先运行时才有效
- javascript - 无法从 setTimeout 中定义的函数中的 useReducer 挂钩访问更新的数据
- javascript - React 获取数据一次又一次地触发
- spring-boot - Firebase 自定义令牌错误 - 已提前 4 分钟生成 issueAt
- ios - 如何更新 UI 并询问 Healthkit 的权限
- xcode - cloudkit 文本搜索的空结果
- python - 如何在 Pandas 数据透视表查询中创建带有日期的字典?