首页 文章

django验证器函数的返回值存储在哪里?

提问于
浏览
6

在我的django应用程序中,这是我的validator.py

from django.core.exceptions import ValidationError
from django.core.validators import URLValidator

def validate_url(value):
    url_validator = URLValidator()
    url_invalid = False
    try:
        url_validator(value)
    except:
        url_invalid = True
        try:
            value = "http://"+value
            url_validator(value)
            url_invalid = False
        except:
            url_invalid = True

    if url_invalid:
        raise ValidationError("Invalid Data for this field")
    return value

用于验证这一点:

from django import forms
from .validators import validate_url
class SubmitUrlForm(forms.Form):
    url = forms.CharField(label="Submit URL",validators=[validate_url])

当我输入 google.co.in 之类的URL,并在从validate_url返回之前打印该值时,它会打印 http://google.co.in 但是当我尝试在我的视图中获取 cleaned_data['url'] 时,它仍然显示 google.co.in . 那么我的验证器返回的值在哪里去,我是否需要显式编辑clean()函数来更改url字段值?

该文件说明如下:

Field子类上的clean()方法负责以正确的顺序运行to_python(),validate()和run_validators()并传播它们的错误 . 如果在任何时候任何方法引发ValidationError,则验证停止并引发该错误 . 此方法返回干净数据,然后将其插入到表单的cleaning_data字典中 .

我仍然不确定验证器返回值的位置以及是否可以使用验证器更改cleaning_data dict .

2 回答

  • 8

    来自docs

    验证器只是一个可调用的对象或函数,它接受一个值,如果值有效则只返回任何内容,否则引发ValidationError .

    简单地忽略返回值 .

    如果您希望能够修改该值,您可以在窗体上使用 clean_ 字段here

    class SubmitUrlForm(forms.Form):
        url = ...
        def clean_url(self):
            value = self.cleaned_data['url']
            ...
            return updated_value
    

    验证器仅用于验证数据,因此这就是验证验证器的返回值被忽略的原因 .

    您正在寻找数据“清理”(以常见形式转换) . 在Django中,Forms负责数据清理 .

  • 0

    使用URLField . 如果需要,它会验证值并预先设置 http .

相关问题