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_
相关产品推荐
相关产品推荐

