You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django文件上传无报错但失败问题排查及解决

问题:Django文件上传无报错但文件未保存到media目录也无数据库记录

我查阅了大量相关问题、遵循Django官方文档并搜索解决方案,但仍无法在Django应用中实现文件上传。无报错提示,form.cleaned_data能正常显示文件及关联的外键字段,但文件并未上传至media目录,数据库中也未生成对应记录。我无法找出遗漏的配置或代码,恳请大家帮忙。

models.py

class ReportFile(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE)
    file = models.FileField(upload_to='files/reports')
    uploaded = models.DateTimeField(auto_now_add=True)
    uploaded_by = models.ForeignKey(User, on_delete=models.CASCADE)
    
    def save(self, *args, **kwargs):        
    
        user = get_current_user()
        if user and not user.pk:
            user = None
        if not self.pk:
            self.creado_por = user
###更新:正如Iain Shelvington指出的,我遗漏了super()调用
        super(ReportFile, self).save(*args, **kwargs)

forms.py

class FileForm(forms.ModelForm): 
    class Meta:                
        model = ReportFile
        fields = ['file','report']

views.py

def CreateFile(request):
  if request.method == 'POST':
    form = FileForm(request.POST,request.FILES)
    if form.is_valid():
        form.save()
        
        print(form.cleaned_data)
#输出:HTTP POST /file 200 [0.09, 127.0.0.1:59053] 
#        {'file': <InMemoryUploadedFile: test-image.png (image/png)>, 'report': <Report: 49>}
        return render(request, 'segcom/file_upload.html', {'form': form,})
  else:
    form = FileForm()
    context = {
        'form':form,
    }
return render(request, 'segcom/file_upload.html', context)

settings.py

# Media Root
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/'

模板文件

{% extends "layouts/base.html" %}
{% load crispy_forms_tags %}

{% block title %} File Upload Test {% endblock %} 

<!-- Specific CSS goes HERE -->
{% block stylesheets %}{% endblock stylesheets %}

{% block content %}
                <div class="row">
                    {{ form.non_field_errors }}
                    <form method = 'post' action="{% url 'file_upload' %}" id="report-form" enctype="multipart/form-data">
                        {% csrf_token %}
                        {{form|crispy}}
                        <div class="modal-footer">
                            <button type="submit" form="report-form" class="btn btn-primary">Guardar</button>
                        </div>
                    </form>
                </div>
{% endblock content %}

<!-- Specific Page JS goes HERE  -->
{% block javascripts %}


{% endblock javascripts %}

问题解决

最终发现问题根源是在ReportFile的save方法中未调用super(),添加后问题解决。

内容的提问来源于stack exchange,提问作者LCD_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:45:36