我想在表单上运行字段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
相符答案 0 :(得分:0)
在您代码的注释中,我可以看到该表单无效,并且它在抱怨必填字段。根据{{3}},这可能是验证程序未运行的原因:
Field子类的clean()方法负责以正确的顺序运行to_python(),validate()和run_validators()并传播其错误。如果任何时候任何方法引发ValidationError,则验证将停止并引发该错误。此方法返回清除数据,然后将其插入表单的cleaned_data字典中。
另一方面,如果需要该字段,则验证not len(name_field) > 0
毫无意义。
尝试在表单中的clean_name
方法中调用验证程序。