【问题标题】:Copying files from a saved FileField to an UploadedFile in Django将文件从保存的 FileField 复制到 Django 中的 UploadedFile
【发布时间】:2025-12-26 23:25:12
【问题描述】:

我需要保存文件,不是来自 request.FILES,而是来自另一个保存的记录。

这是模型记录的代码:

class Foo(models.Model)
    slug = models.SlugField()

class FooFile(models.Model):
    name = models.CharField(max_length=100)
    file = models.FileField(upload_to='foo_folder')
    foo = models.ForeignKey(Foo, related_name='files')

class RealRecord(models.Model):
    slug = models.SlugField()
    awesome_file=models.FileField(upload_to='awesome')
    mediocre_file=models.FileField(upload_to='mediocre')

还有视图(在本例中MyForm 是保存到 RealRecord 的模型表单):

def example(request, record=1, template_name="form.html")
    foo_obj = Foo.objects.get(pk=record)
    SAVED_FILES = {}
    for file in foo_obj.files.all():
         SAVED_FILES[file.name]=file.file
    if request.method == 'POST':
        form = MyForm(data=request.POST, files=SAVED_FILES)
        if form.is_valid():
            form.save() 
            # rest of view
    else:
        form = MyForm()
    return render(request, template_name, locals())

所以事情基本上是FieldFile 被用作UploadedFile 对象。

每个Foo 将有一个名为awesome_fileFooFile 记录和另一个名为mediocre_file 的记录,与RealRecord 中的必填字段相匹配。

疯狂的是,这完全验证了。 然而,问题在于,在创建的结果记录中,awesome_file 和 mediocre_file 的路径都在“foo_folder”中。但我不希望“foo_folder”中的文件,我希望它们位于我为RealRecord 中的每个字段指定的路径中。

所以我想我想知道我可以对来自 FooFieldFieldFile 值做些什么,以便它们的行为类似于传统的 UploadedFile 并获取各自字段的 upload_topath 值。

【问题讨论】:

    标签: django file-upload filefield django-file-upload


    【解决方案1】:

    哇……你们!我真的希望有人会想出一个答案。无论如何,我能够想出自己的解决方案;不确定它是否是最佳的,但它可以工作。

    我对@9​​87654322@做了一个小修改,所以它也存储了上传文件的content_type:

    class FooFile(models.Model):
        name = models.CharField(max_length=100)
        file = models.FileField(upload_to='foo_folder')
        content_type = models.CharField(max_length=254) # max length given by RFC 4288 
        foo = models.ForeignKey(Foo, related_name='files')
    

    然后,在视图中,我为每个 FooFile 记录创建一个 SimpleUploadedFile 对象:

    from django.core.files.uploadedfile import SimpleUploadedFile
    import os
    
    def example(request, record=1, template_name="form.html")
        foo_obj = Foo.objects.get(pk=record)
        SAVED_FILES = {}
        for saved_file in foo_obj.files.all():
            SAVED_FILES[file.name]=SimpleUploadedFile(os.path.basename(saved_file.file.path), saved_file.file.read(), saved_file.content_type)
        if request.method == 'POST':
            form = MyForm(data=request.POST, files=SAVED_FILES)
            if form.is_valid():
                form.save() 
                # rest of view
        else:
            form = MyForm()
        return render(request, template_name, locals())
    

    【讨论】:

    最近更新 更多