【问题标题】:Django crispy-forms doesn't show error meesage for FileExtensionValidatorDjangocrispy-forms 不显示 FileExtensionValidator 的错误消息
【发布时间】:2019-07-19 07:44:06
【问题描述】:
  • 包版本:1.7.2
  • Django 版本:2.1
  • Python 版本:3.7
  • 模板包:Bootstrap4

我的模型中有一个 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 error-messaging


    【解决方案1】:

    根据脆皮文档: '默认情况下,当 django-crispy-forms 遇到错误时,它会默默地失败,记录它们并在可能的情况下继续工作。添加了一个名为 CRISPY_FAIL_SILENTLY 的设置变量,以便您可以控制此行为。如果您想引发异常而不是记录,告诉您在调试模式下开发时发生了什么,您可以将其设置为:

    CRISPY_FAIL_SILENTLY = not DEBUG 
    

    此外,您还可以在此处查看其他错误属性(文档): https://django-crispy-forms.readthedocs.io/en/d-0/tags.html#helper-attributes-you-can-set

    【讨论】:

    • 感谢您的回复。我在settings.py中添加了CRISPY_FAIL_SILENTLY = not DEBUG,但是FileExtensionValidatorfile_size()验证器生成的FileField错误信息仍然不会显示在屏幕上。我还应该做什么?
    猜你喜欢
    • 2019-07-17
    • 2015-04-17
    • 2015-11-13
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2010-12-12
    相关资源
    最近更新 更多