微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不属于表单的字段的Perfom Django验证

如何解决不属于表单的字段的Perfom Django验证

我想基于Django模型中的字段之一引发ValidationError,而不必将各个字段作为ModelForm的一部分提交。经过一番搜寻后,我发现模型验证器的概念。因此,我尝试执行以下操作:

def minimumDuration(value):
    if value == 0:
        raise ValidationError("Minimum value accepted is 1 second!")

class PlaylistItem(models.Model):
    position = models.IntegerField(null=False)
    content = models.ForeignKey(Content,null=True,on_delete=models.SET_NULL)
    item_duration = models.IntegerField(validators = [minimumDuration],default = 5,blank=True)
    playlist = models.ForeignKey(Playlist,on_delete=models.CASCADE)

但是,当我在各个字段中引入0时,没有错误出现。从Django的文档中,我发现保存模型时不会自动应用验证器。它将我重定向this page,但我并不真正了解如何应用这些内容。有想法吗?

解决方法

以下是在模型外部具有这样的自定义字段的表单示例:

class ExampleForm(forms.ModelForm):
    custom_field = forms.BooleanField(
        label='Just non model field,replace with the type you need',required=False
    )

    class Meta:
        model = YourModel

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        # optional: further customize field widget
        self.fields['restrict_countries'].widget.attrs.update({
            'id': self.instance.pk + '-custom_field','class': 'custom-field-class'
        })
        # optional: further customize field widget
        self.fields['restrict_countries'].initial = self._get_custom_initial()

    def _get_custom_initial(self):
        # compute initial value based on self.instance and other logic
        return True

    def _valid_custom_field(value):
        # validate your value here
        # return Boolean

    def clean(self):
        """
        The important method: override clean to hook your validation
        """
        super().clean()
        custom_field_val = self.cleaned_data.get('custom_field')
        if not self._valid_custom_field(custom_field_val):
            raise ValidationError(
                'Custom Field is not valid')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?