这是一些相关的代码:
models.py
def file_upload_path(instance,filename): path = os.path.join('uploaded_files',str(uuID4())) return path class Uploadedfile(models.Model): file_object = models.fileFIEld(null=False,blank=False,upload_to=file_upload_path) def __unicode__(self): return self.file_object.name
forms.py
class UploadfileForm(forms.ModelForm): class Meta: model = Uploadedfile fIElds = ['file_object']
vIEws.py
def home(request):... if form.is_valID(): new_file = form.save(commit=True) print new_file...
此代码打印出我想要的内容,即调用upload_to后文件路径,文件已保存到所述位置(例如“uploaded_files / b992e44e-6403-4c37-82b4-b3c403d07f79”).
现在,有了这个vIEws.py,事情发生了变化:
vIEws.py
def home(request):... if form.is_valID(): new_file = form.save(commit=False) print new_file # new_file_object = fileObject(os.path.abspath(new_file.file_object.url)) # new_file.mime_type = new_file_object.get_mime_type()...
而不是路径,我得到原始文件名(例如“jnes.exe”),所以我无法处理文件,所以我可以获取其mime类型,例如,然后更新模型并保存它做数据库.
我有什么想法我做错了吗?谢谢.
我是如何解决它的:
我对仍在内存中/暂时在磁盘上的文件进行必要的模型编辑,因为Django不允许您直接找到fileFIEld的位置,直到您实际保存新模型实例.
forms.py
def save(self,commit=True,*args,**kwargs): new_model = super(UploadfileForm,self).save(commit=False) file_object = self.cleaned_data['file_object'] file_info = fileObject(file_object) new_model.mime_type = file_info.get_mime_type() new_model.sha256 = file_info.get_sha256() new_model.md5 = file_info.get_md5() if commit: new_model.save() return new_model
我通过从Django的Uploadedfile临时对象读取数据,在fileObject的构造函数中获取哈希和mime类型. (谢谢丹尼尔)
解决方法 docs声明如下The file is saved as part of saving the model in the database,so the actual file name used on disk cannot be relIEd on until after the model has been saved.
所以你没有错.只有在提交之后它才会存在.
如果要在保存文件之前以某种方式处理该文件.您需要在临时文件时访问它. This answer可以帮助您使用这种替代方式访问文件以获取mimetype等.
总结以上是内存溢出为你收集整理的使用commit = False调用save()时,不会调用Django的FileField“upload_to”方法全部内容,希望文章能够帮你解决使用commit = False调用save()时,不会调用Django的FileField“upload_to”方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)