【问题标题】:Validation not running in django form验证未以 django 形式运行
【发布时间】:2019-07-01 21:57:21
【问题描述】:

我想在我的表单上运行字段验证,如表单和字段验证-using validation in practice

我的表单如下所示:

from kapsule.validators import name_zero_min_length, name_max_length
class NameUpdateForm(forms.Form):

    name = forms.CharField(
        validators=[
            name_zero_min_length,
            name_max_length
        ]
    )

我的验证者:

from django.core.exceptions import ValidationError


def name_zero_min_length(name_field):
    # Check minimum length
    if not len(name_field) > 0:
        print('firing zero length')
        raise ValidationError(
            "My custom error message name must be at least one character"
        )


def name_max_length(name_field):
    # Check that the name is under the max length
    MAX_LENGTH = 200
    if len(name_field) > MAX_LENGTH:
        print('raising')
        raise ValidationError(
            "My custom error message name cannot be more than {} characters".format(MAX_LENGTH)
        )

我的看法是这样的:

def edit_kapsule_name(request, kapsule_pk):
    kapsule = Kapsule.objects.get(pk=kapsule_pk)
    form = NameUpdateForm(request.POST)

    response = {}
    print('pre-validation')
    if form.is_valid():
        print('VALID')
        name = form.data.get('name')
        kapsule.name = name
        kapsule.save(update_fields=['name'])
    else:
        print('INVALID') # INVALID
        print('json') # json
        errors = form._errors.as_json()
        print(errors) # {"name": [{"message": "This field is required.", "code": "required"}]}

我的输出在上面的代码中被注释了(无效,并且给出了与我预期不同的错误)。

为什么我的自定义验证没有运行?

这似乎与我的模型验证(工作)相匹配,第二个回复here

【问题讨论】:

  • 为什么说不运行?
  • @RaydelMiranda 验证器中有打印语句(未显示),我看到字段必需的错误,我也希望看到我自己的错误。
  • @RaydelMiranda 我还在验证器中的 if 子句之前添加了一个 print 语句,它肯定不会被调用

标签: django validation


【解决方案1】:

好吧,在您的代码评论中,我可以看到表单无效,并且它抱怨必填字段。根据docs,这可能是您的验证器没有运行的原因:

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

另一方面,如果该字段是必填项,则验证not len(name_field) > 0 没有多大意义。

尝试调用您的验证器作为表单中clean_name 方法的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多