我的模型中有一个FileField,我实现了Django的FileExtensionValidator,以及我自己的自定义字段验证器来检查文件大小。它工作正常,但当这些验证失败时,crispy-forms不会显示错误消息。
模型
from django.core.validators import FileExtensionValidator
class Project(models.Model):
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='projects',
)
title = models.CharField(
_('project name'),
max_length=100,
help_text=_('Required. 100 characters or fewer.'),
)
slug = models.SlugField(
_('slug'),
max_length=80,
)
created = models.DateTimeField(
_('dateTime created'),
auto_now_add=True,
)
xmlfile = models.FileField(
_('input file'),
upload_to=user_directory_path,
validators=[FileExtensionValidator(allowed_extensions=('xml',))],
help_text=_('Required. Please upload an XML file.'),
)
形成
from django.core.exceptions import ValidationError
def file_size(value):
limit = 9 * 1024 * 1024
if value.size > limit:
raise ValidationError('File too large. Size should not exceed 9 MiB.')
class ProjectForm(forms.ModelForm):
xmlfile = forms.FileField(
label='XML File Upload',
widget=forms.FileInput(attrs={'accept':'application/xml'}),
validators=[file_size],
)
class Meta:
model = Project
widgets = {
'owner': HiddenInput(),
}
模板
{% block content %}
<h1>New Project</h1>
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="Create" />
</form>
{% endblock content %}
视图
class ProjectCreate(CreateView):
form_class = ProjectForm
model = Project
template_name = 'project_new.html'
success_url = reverse_lazy('my_projects_list')
def get_initial(self):
initial = super().get_initial()
initial['owner'] = self.request.user
return initial
当尝试上传小于9M的XML文件时,它可以工作,并且用户将被带到成功URL。但是当文件格式或文件大小错误时,我们继续保留在project_new.html的页面上是正确的,但此页面上没有显示与FileExtensionValidator或file_size()相关的错误消息。
当我将{{ form|crispy }}
更改为{{ form.as_p }}
时,验证错误将显示在屏幕上。您知道如何在使用{{ form|crispy }}
时显示验证错误消息吗?谢谢!
根据脆弱的文档:'默认情况下,当django-crispy-forms遇到错误时,它会无声地失败,记录它们并在可能的情况下继续工作。添加了名为CRISPY_FAIL_SILENTLY的设置变量,以便您可以控制此行为。如果要引发异常而不是记录,告诉您在调试模式下进行开发时发生了什么,可以将其设置为:
CRISPY_FAIL_SILENTLY =不是DEBUG'
此外,您可以在这里查看其他错误属性:https://django-crispy-forms.readthedocs.io/en/d-0/tags.html#helper-attributes-you-can-set