2

我需要保存文件,不是来自 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人都有一个带有名字的FooFile记录awesome_file和另一个带有名字的记录,mediocre_fileRealRecord.

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

所以我想我想知道我可以对FieldFile来自的值做些什么,FooField以便它们表现得像传统的 UploadedFile 并获取它们各自字段的upload_to和值。path

4

1 回答 1

1

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

我做了一个小修改,FooFile所以它也存储了上传文件的 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')

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

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())
于 2011-05-02T18:40:18.900 回答