验证未以Django形式运行

时间:2019-02-07 17:39:26

标签: django validation

我想在表单上运行字段validateatin,就像在表单和字段验证-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

相符

1 个答案:

答案 0 :(得分:0)

在您代码的注释中,我可以看到该表单无效,并且它在抱怨必填字段。根据{{​​3}},这可能是验证程序未运行的原因:

  

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

另一方面,如果需要该字段,则验证not len(name_field) > 0毫无意义。

尝试在表单中的clean_name方法中调用验证程序。