Хрустящие формы в Django не отображают сообщения об ошибках для FileExtensionValidator - PullRequest
0 голосов
/ 25 февраля 2019
  • Версия пакета: 1.7.2
  • Версия Django: 2.1
  • Версия Python: 3.7
  • Пакет шаблонов: Bootstrap4

В моей модели есть FileField, и я реализовал FileExtensionValidator от Django, а также свой собственный валидатор для проверки размера файла.Это работает, но 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-файл размером менее 9 МБ он работает, и пользователь попадает на URL успеха.Но если формат файла или размер файла неправильный, правильно, что мы продолжаем оставаться на странице project_new.html, но на этой странице не отображается сообщение об ошибке, связанной с FileExtensionValidator или file_size ().

КогдаЯ изменяю {{ form|crispy }} на {{ form.as_p }}, ошибка проверки будет отображаться на экране.Знаете ли вы, как отображать сообщения об ошибках проверки при использовании {{ form|crispy }}?Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Согласно хрустящим документам: «По умолчанию, когда django-crispy-формы сталкивается с ошибками, он молча терпит неудачу, регистрирует их и продолжает работать, если это возможно.Была добавлена ​​переменная настроек CRISPY_FAIL_SILENTLY, чтобы вы могли контролировать это поведение.Если вы хотите вызывать исключения вместо ведения журнала, сообщая вам, что происходит, когда вы разрабатываете в режиме отладки, вы можете установить для него:

CRISPY_FAIL_SILENTLY = not DEBUG '

Кроме того, вы можете проверитьдругие атрибуты ошибки здесь: https://django -crispy-forms.readthedocs.io / en / d-0 / tags.html # helper-attribute-you-can-set

...