Django FileExtensionValidator не показывает сообщение об ошибке

Я использую FileExtensionValidator Django FileField и использую этот ответ, чтобы ограничить размер файла, оба являются работает, но сообщения об ошибках проверки отображаться не будут.

Я использую Django 2.1. Вот мой код:

Модель

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(),
        }

Просмотр

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 (). Ты знаешь почему? Где я ошибся?

Спасибо за ваше время и помощь!


person student    schedule 24.02.2019    source источник


Ответы (2)


Я сам нашел ответ!

Изначально я использовал {{ form|crispy }} в шаблоне project_new.html. После того, как я изменил его на {{ form.as_p }}, информация об ошибке будет отображаться на экране.

Это ошибка crispy_forms? Как заставить crispy_forms отображать сообщение проверки для FileField?

person student    schedule 25.02.2019

Попробуйте создать функцию с именем clean_xmlfile внутри формы модели (ProjectForm), которая будет вызываться автоматически.

def clean_xmlfile(self, value):
    limit = 9 * 1024 * 1024
    if value.size > limit:
        raise ValidationError('File too large. Size should not exceed 9 MiB.')
person HariHaraSudhan    schedule 24.02.2019
comment
Это не работает. На веб-сайте указано, что тип исключения: AttributeError Exception Value: объект ProjectForm не имеет атрибута size - person student; 25.02.2019
comment
моя проблема, я забыл передать себя в качестве первого аргумента, теперь я обновил код - person HariHaraSudhan; 25.02.2019
comment
Настоящая проблема, которую я сейчас имею, заключается в том, как сделать так, чтобы сообщение об ошибке появлялось при использовании {{ form|crispy }}. Смотрите мой ответ ниже! - person student; 25.02.2019