Копирование файлов из сохраненного FileField в UploadedFile в Django - PullRequest
2 голосов
/ 29 апреля 2011

Мне нужно сохранять файлы не из 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.

Так что, я думаю, мне интересно, что я могу сделать со значениями FieldFile из FooField, чтобы они вели себя как традиционный UploadedFile и получали значения upload_to и path для соответствующих полей. *

1 Ответ

1 голос
/ 02 мая 2011

Аууу ... ребята!Я действительно надеялся, что кто-нибудь придет с ответом.В любом случае, я смог придумать собственное решение;не уверен, что это оптимальный вариант, но он работает.

Я сделал небольшой мод для 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())
...