【问题标题】:Generating an input tag with "accept" attribute in Django form using FileField使用 FileField 在 Django 表单中生成具有“接受”属性的输入标签
【发布时间】:2023-03-31 12:18:02
【问题描述】:

我想创建一个表单来从iOS Safari上传和保存视频,它支持输入标签的“accept”属性,例如:

<input type=file accept="video/*">

让您拍摄和上传新视频或在设备上选择视频文件。

我查看了 Django 文档:https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.FileField

但看不到我可以在哪里指定输入的“接受”属性。这可能吗?我可以在模板中创建输入标签,并且仍然使用 Django 表单处理来接受文件吗?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    简单。在您的模型表单中,只需确保使用所需的 accept HTML 属性创建 FileInput 小部件:

    from django import forms
    
    class VideoForm(forms.ModelForm):
        class Meta:
            model = Video
            exclude = []
            widgets = {
                'video_file': forms.FileInput(attrs={'accept': '.mov,video/quicktime'}),
            }
    

    【讨论】:

    • 是否需要在使用它的每个字段旁边指定此小部件?如果是这样,看看一个例子会很有帮助。
    • @pdoherty926 是的。只需将字段添加到 widgets 字典即可。
    【解决方案2】:

    没有简单的方法可以做到这一点,你可以看到一些好的答案in this question 另外,个人建议(未经测试):创建表单后,像这样设置您想要的任何属性

        for f in form.fields:
            if isinstance(form.fields[f].widget, ClearableFileInput):
                form.fields[f].widget.attrs['accept'] = 'video/*'
    

    【讨论】:

      【解决方案3】:

      您还可以通过在表单中​​包含单行代码来执行简单的步骤:

      media = forms.FileField(widget=forms.FileInput(attrs={'accept':'image/*,video/*'}))
      

      在 django 前端的 input 元素上设置 accept 属性。 注意:这对 forms.ImageField() 也有效。

      【讨论】:

        【解决方案4】:

        制作一个带有accept 参数的自定义小部件

        class AcceptingFileField(FileInput):
            def __init__(self, attrs=None, accept=['audio/*']):
                final_attrs = {}
                if accept:
                    final_attrs = {'accept': ','.join(accept)}
                if attrs is not None:
                    final_attrs.update(attrs)
                super(AcceptingFileField, self).__init__(attrs=final_attrs)
        

        然后你就进入你的ModelForm

        widgets = {
            'myvideoformfield': AcceptingFileField(accept=['video/*'])
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-12
          • 1970-01-01
          • 2019-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 2014-10-17
          • 2010-09-15
          相关资源
          最近更新 更多