【问题标题】:Where is a django validator function's return value stored?django 验证器函数的返回值存储在哪里?
【发布时间】:2017-09-11 10:09:34
【问题描述】:

在我的 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,验证将停止并引发该错误。该方法返回干净的数据,然后将其插入到表单的cleaned_data字典中。

我仍然不确定验证器返回值的去向以及是否可以使用验证器更改cleaned_data dict。

【问题讨论】:

    标签: python django validation


    【解决方案1】:

    来自docs

    验证器只是一个可调用的对象或函数,它接受一个值 如果值有效或引发 如果不是,则 ValidationError。

    简单地忽略返回值。

    如果您希望能够修改值,您可以在here 所述的表单上使用clean_字段

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

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

    您正在寻找数据“清理”(将其转换为通用形式)。在 Django 中,Forms 负责数据清理。

    【讨论】:

      【解决方案2】:

      使用URLField。它验证值并在必要时添加 http

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多