Django使用自定义FileInput小部件的编辑表单无法加载已有文件怎么办
问题原因
你遇到的文件无法回显的问题和class属性没有关系,核心原因是你手动将文件字段的小部件指定为了原生forms.FileInput:
- 原生HTML的
<input type="file">出于浏览器安全限制,不允许预设文件值,因此不会显示已上传的文件信息。 - Django的ModelForm默认给文件字段使用的是
ClearableFileInput小部件,该小部件除了基础文件输入框外,还会额外渲染已上传文件的访问链接、清除文件的勾选框,你删除自定义字段配置后看到的“正常回显”就是该小部件的渲染结果。你之前误以为是class属性导致的问题,实际是删除自定义字段配置后,Django自动恢复了默认的ClearableFileInput小部件。
解决方案
只要将自定义小部件改为ClearableFileInput即可,既可以保留你需要的accept限制、自定义class样式,也能正常显示已上传的文件信息,修改后的代码如下:
# forms.py class ContentCreateForm(forms.ModelForm): text_instruction = forms.FileField(widget=forms.ClearableFileInput(attrs={'accept': '.txt', 'class': 'form-control'})) course_video = forms.FileField(widget=forms.ClearableFileInput(attrs={'accept': 'video/*', 'class': 'form-control'})) preview_video = forms.FileField(widget=forms.ClearableFileInput(attrs={'accept': 'video/*', 'class': 'form-control'}), required=False) resource_file = forms.FileField(widget=forms.ClearableFileInput(attrs={'accept': '.pdf', 'class': 'form-control'})) class Meta: model = Content fields = '__all__'
也可以通过Meta.widgets配置,无需重复声明字段,自动继承模型的字段属性,写法更简洁:
# forms.py 更简洁的写法 class ContentCreateForm(forms.ModelForm): class Meta: model = Content fields = '__all__' widgets = { 'text_instruction': forms.ClearableFileInput(attrs={'accept': '.txt', 'class': 'form-control'}), 'course_video': forms.ClearableFileInput(attrs={'accept': 'video/*', 'class': 'form-control'}), 'preview_video': forms.ClearableFileInput(attrs={'accept': 'video/*', 'class': 'form-control'}), 'resource_file': forms.ClearableFileInput(attrs={'accept': '.pdf', 'class': 'form-control'}), }
注意事项
模板渲染字段时直接使用{{ form.字段名 }}即可,不要手动写原生文件输入框标签,否则会丢失ClearableFileInput渲染的已上传文件信息。
内容的提问来源于stack exchange,提问作者Nahidujjaman Hridoy
相关产品推荐
相关产品推荐

