Django 为什么赢了';我的文件是否保存到实例(它保存到磁盘?

Django 为什么赢了';我的文件是否保存到实例(它保存到磁盘?,django,django-views,django-file-upload,Django,Django Views,Django File Upload,我可以让我的文件保存到我告诉它的磁盘上,但不能让它保存到实例上,我一点也不知道为什么 models.py views.py 处理上传的文件 song_upload.html(相关部分) 该文件位于media/Upload/music中,但在admin audio_文件中为空,如果我将audio_文件设置为blank=False(这是我想要做的),我被告知该字段是必需的。什么给 提前谢谢!在这里已经有一段时间了,文档对我来说似乎很轻(新手)。clean\u audio\u文件应该返回此特定字段的已

我可以让我的文件保存到我告诉它的磁盘上,但不能让它保存到实例上,我一点也不知道为什么

models.py views.py 处理上传的文件 song_upload.html(相关部分) 该文件位于media/Upload/music中,但在admin audio_文件中为空,如果我将audio_文件设置为blank=False(这是我想要做的),我被告知该字段是必需的。什么给


提前谢谢!在这里已经有一段时间了,文档对我来说似乎很轻(新手)。

clean\u audio\u文件
应该返回此特定字段的已清理数据,因此您需要添加一个
返回文件

发件人:

就像常规字段
clean()
方法,如上所述,此方法应 返回清理后的数据,无论 不管它是否改变了什么


据我所知,您不需要
处理上传的文件()
。您正在使用
ModelForm
和。它支持
upload\u to
参数,并自动将文件保存到目标

Django docs的基本文件上传使用的是
表单
和,因此它涉及
handle\u upload\u file()
函数

因此,试着简单地删除这一行:

handle_uploaded_file(request.FILES['audio_file'])
从你的观点来看,请告诉我接下来会发生什么

编辑:还有,@lazerscience是对的,你需要添加

return self.cleaned_data

清理音频文件()的末尾。(但不是
返回文件
,因为即使只清理了一个字段,也应始终返回整个清理后的数据字典。)

您还应包括
歌曲格式
的代码!是的,如果没有SongForm,我们无法判断发生了什么。进行了您提到的两项更改,现在收到一条错误消息:“dict”对象没有属性“\u committed”。回溯只包括我自己编写的一行代码:
form.save()
。如果我删除form.save(),我看不到错误,但是表单也不会保存!像往常一样,在文件上传方面,谷歌并没有特别的帮助,我也不知道从哪里开始处理文档。。。提前谢谢!这很奇怪。看来我错了,@lazerscience确实是对的,只需要从清理方法返回文件。(因为
\u committed
应该是filefield状态的一部分,但它在
清理的\u数据
字典中不存在。)尝试
返回文件
,而不是
返回自清理的\u数据
。不过,我仍然确信
models.FileField
将处理文件存储。非常感谢Anton@lazerscience的解决方案,再加上删除handle_上传的_file()非常有效!呸。这就是我不仔细阅读的结果。。。我知道当你花时间帮助别人解决问题,而他们没有仔细阅读你的回复时,你一定会感到非常沮丧。我诚挚的道歉。16小时前你是对的!
    def handle_uploaded_file(f):
        ext = os.path.splitext(f.name)[1]
        destination = open('media/uploaded/music/name%s' %(ext), 'wb+')
        for chunk in f.chunks():
            destination.write(chunk)
        destination.close()
    {% block main %}
    {{band.name}}
        <form enctype="multipart/form-data" method="post" action="">{% csrf_token %}
           {{ form.as_p}}
           <input type="submit" value="Add song" />
        </form>
    {% endblock %}
    class SongForm(forms.ModelForm):
        band = forms.ModelChoiceField(queryset=Band.objects.all(), widget=forms.HiddenInput) 
        def clean_audio_file(self):
            file = self.cleaned_data.get('audio_file',False)
            if file:
                if file._size > 10*1024*1024:
                    raise forms.ValidationError("Audio file too large ( > 10mb)")
                if not file.content_type in ["audio/mp3", "audio/mp4"]:
                    raise forms.ValidationError("Content type is not mp3/mp4")
                if not os.path.splitext(file.name)[1] in [".mp3", ".mp4"]:
                    raise forms.ValidationErorr("Doesn't have proper extension")
            else:
                raise forms.ValidationError("Couldn't read uploaded file")
        class Meta:
            model = Song
handle_uploaded_file(request.FILES['audio_file'])
return self.cleaned_data