加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用commit = False调用save()时,不会调用Django的FileField“up

发布时间:2020-12-20 13:51:45 所属栏目:Python 来源:网络整理
导读:上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库. 这是一些相关的代码: models.py def file_upload_path(instance,filename): path = os.path.join('uploaded_files',str(uuid4())) return path class UploadedFile(mo
上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库.

这是一些相关的代码:

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等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读