首页 > 解决方案 > 如何在 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:

但是我还没有达到这个问题的解决方案。

标签: djangovalidationmodelmodelform

解决方案


推荐阅读