2011-04-29 120 views
2

我需要保存文件,而不是来自request.FILES,而是保存另一个记录。将文件从保存的FileField复制到Django中的UploadedFile

下面是该模型记录代码:

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_file,在RealRecord必填字段匹配起来。

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

所以我想我想知道什么我可以做的FieldFile值从FooField来,让他们像一个传统的UploadedFile并获得各自领域的upload_topath值。

回答

1

Awww ...你们!我真的希望有人会提出一个答案。无论如何,我能够提出自己的解决方案;不知道它是否是最佳的,但它的工作原理。

我做了一个轻微的mod 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') 

,然后,在视图中,我创建的每个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()) 
+0

完成的代码在github上可用:https://github.com/JordanReiter/django-unauth-posting如果有人发现它有用,请让我知道。另外,请分叉并改进它! – 2011-05-02 18:42:49

相关问题