django - 如何在 django 中进行模型级自定义字段验证?
问题描述
我有这个模型:
class StudentIelts(Model):
SCORE_CHOICES = [(i/2, i/2) for i in range(0, 19)]
student = OneToOneField(Student, on_delete=CASCADE)
has_ielts = BooleanField(default=False,)
ielts_listening = FloatField(choices=SCORE_CHOICES, null=True, blank=True, )
ielts_reading = FloatField(choices=SCORE_CHOICES, null=True, blank=True, )
ielts_writing = FloatField(choices=SCORE_CHOICES, null=True, blank=True, )
ielts_speaking = FloatField(choices=SCORE_CHOICES, null=True, blank=True, )
并具有此模型形式:
class StudentIeltsForm(ModelForm):
class Meta:
model = StudentIelts
exclude = ('student')
def clean(self):
cleaned_data = super().clean()
has_ielts = cleaned_data.get("has_ielts")
if has_ielts:
msg = "Please enter your score."
for field in self.fields:
if not self.cleaned_data.get(str(field)):
self.add_error(str(field), msg)
else:
for field in self.fields:
self.cleaned_data[str(field)] = None
self.cleaned_data['has_ielts'] = False
return cleaned_data
如您所见,如果学生有雅思,那么他/她必须在模型表格中指定他/她的分数。我现在想在模型级别上执行此操作。所以我需要自定义我的模型保存方法,或者 clean 方法或 full_clean 方法,我不确定,我猜。
我该怎么做?
如果我如下更改,我的 StudentIeltsForm 行为会和以前一样吗?
class StudentIeltsForm(ModelForm):
class Meta:
model = StudentIelts
exclude = ('student')
我读到这个: https ://docs.djangoproject.com/en/2.2/ref/models/instances/#validating-objects
这: https ://kite.com/python/docs/django.db.models.Model.clean
而且我知道要遍历模型字段,我必须使用
for field in self._meta.fields:
但是我还没有达到这个问题的解决方案。
解决方案
推荐阅读
- javascript - 努力将数组的索引作为道具传递给另一个组件
- python - 丢弃方差为零的组
- c# - 搜索列表中是否存在字符串
- wordpress - WordPress 网站重定向到未知链接(由于插件/恶意软件 Zend Fonts WP)
- react-native - 反应原生底部选项卡导航到所需屏幕
- jquery - 我希望它根据一天横向滚动
- flutter - Flutter中可滚动的Carousel + GridView + GridView + GridView
- templates - 为 Rstudio (default.R) 创建一个模板脚本,其中创建日期自动插入到脚本中
- flutter - 如何在 Flutter 中的 TextField 标签中添加红色星号
- elasticsearch - 围绕平均值的 Elasticsearch 范围聚合