【问题标题】:Django FileExtensionValidator doesn't show error meesageDjango FileExtensionValidator 不显示错误消息
【发布时间】:2019-07-17 20:42:09
【问题描述】:

我正在使用 FileExtensionValidator Django 的 FileField 并利用 this answer 来限制文件大小,两者都有效,但不会显示验证错误消息。

我正在使用 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

我测试了这段代码。当尝试上传小于 9M 的 XML 文件时,它可以工作并且用户被带到成功 URL。但是当文件格式或文件大小错误时,我们继续停留在project_new.html页面是正确的,但奇怪的是这个页面上并没有显示与FileExtensionValidator和file_size()相关的错误信息。你知道为什么吗?我哪里弄错了?

感谢您的宝贵时间和帮助!

【问题讨论】:

    标签: django validation django-crispy-forms filefield error-messaging


    【解决方案1】:

    我自己找到了答案!

    最初,我在模板 project_new.html 中使用{{ form|crispy }}。我改成{{ form.as_p }}后,屏幕上会显示错误信息。

    这是crispy_forms 的错误吗?如何使 Krispy_forms 显示 FileField 的验证消息?

    【讨论】:

      【解决方案2】:

      尝试在模型表单(ProjectForm)中创建一个名为clean_xmlfile的函数,它会自动调用。

      def clean_xmlfile(self, value):
          limit = 9 * 1024 * 1024
          if value.size > limit:
              raise ValidationError('File too large. Size should not exceed 9 MiB.')
      

      【讨论】:

      • 这不起作用。该网站说异常类型:AttributeError 异常值:'ProjectForm'对象没有属性'size'
      • 我的错,我忘了传递 self 作为第一个参数,现在我更新了代码
      • 现在我遇到的真正问题是如何在使用{{ form|crispy }} 时显示错误消息。请在下面查看我自己的答案!
      猜你喜欢
      • 2019-07-19
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多