Хрустящие формы в Django не отображают сообщения об ошибках для FileExtensionValidator
- Версия пакета:1.7.2
- Джанго версия:2.1
- Версия Python:3.7
- Пакет шаблонов: Bootstrap4
У меня есть FileField в моей модели, и я реализовал Django FileExtensionValidator, а также свой собственный валидатор пользовательских полей для проверки размера файла. Это работает, но crispy-формы не отображают сообщение об ошибке, когда эти проверки не пройдены.
модель
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
При попытке загрузить XML-файл размером менее 9M, он работает, и пользователь попадает на URL успеха. Но если формат файла или размер файла неправильный, правильно, что мы продолжаем оставаться на странице project_new.html, но на этой странице не отображается сообщение об ошибке, связанной с FileExtensionValidator или file_size().
Когда я меняю {{ form|crispy }}
в {{ form.as_p }}
, ошибка проверки будет отображаться на экране. Знаете ли вы, как отображать сообщения об ошибках проверки при использовании {{ form|crispy }}
? Спасибо!
1 ответ
Согласно хрустящим документам: "По умолчанию, когда django-crispy-формы сталкивается с ошибками, он молча терпит неудачу, регистрирует их и продолжает работать, если это возможно. Была добавлена переменная настроек CRISPY_FAIL_SILENTLY, чтобы вы могли контролировать это поведение. Если вы хотите вызывать исключения вместо ведения журнала, сообщая вам, что происходит, когда вы разрабатываете в режиме отладки, вы можете установить его на:
CRISPY_FAIL_SILENTLY = не DEBUG'
Кроме того, вы можете проверить другие атрибуты ошибок здесь: https://django-crispy-forms.readthedocs.io/en/d-0/tags.html