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_fileあり、の必須フィールドと一致しますRealRecord

クレイジーなことは、これは完全に検証されます。ただし、問題は、作成される結果のレコードで、awesome_fileとmediocre_fileの両方のパスが「foo_folder」にあることです。ただし、「foo_folder」内のファイルは必要ありません。の各フィールドに指定したパスにファイルを配置する必要がありますRealRecord

したがって、従来のUploadedFileのように動作し、それぞれのフィールドの値と値を取得するために、FieldFileからの値に対して何ができるのか疑問に思っていると思います。FooFieldupload_topath

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 に答える