Django - как вы превращаете InMemoryUploadedFile в ImageField FieldFile?

Я пробовал help(django.db.models.ImageField) и dir(django.db.models.ImageField), ища, как вы можете создать объект ImageField из загруженного изображения.

request.FILES имеет изображения как InMemoryUploadedFile, но я пытаюсь сохранить модель, содержащую ImageField, поэтому как мне повернуть InMemoryUploadedFile в ImageField?

Как вы об этом узнаете? Я подозреваю, что у двух классов есть отношения наследования, но мне нужно было бы сделать много dir() -ing, чтобы узнать, буду ли я смотреть.

Ответ 1

Вам нужно сохранить InMemoryUploadedFile в ImageField, а не "превратить" его в ImageField:

image = request.FILES['img']
foo.imagefield.save(image.name, image)

где foo - экземпляр модели, а поле изображения - ImageField.

В качестве альтернативы, если вы вытаскиваете изображение из формы:

image = form.cleaned_data.get('img')
foo.imagefield.save(image.name, image)

Ответ 2

Вы пытаетесь сделать это в ModelForm?

Так я сделал для поля файла

class UploadSongForm(forms.ModelForm):
    class Meta:
        model = Mp3File

    def save(self):
        content_type = self.cleaned_data['file'].content_type
        filename = gen_md5() + ".mp3"
        self.cleaned_data['file'] = SimpleUploadedFile(filename, self.cleaned_data['file'].read(), content_type)
        return super(UploadSongForm, self).save()

Вы можете взять его в качестве примера и посмотреть в исходном коде, что нужно классу InMemoryUploadedFile в параметрах инициализации.

Ответ 3

Вы можете реализовать форму с полем загрузки файла с помощью экземпляров формы, вот представление:

def form_view(request):
    if request.method == 'POST':
        form = FooForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return render_to_response('result.html')
        return render_to_response('form.html', {
            'form': form;
            'error_messages': form.errors;
        }
    form = FooForm()
    return render_to_response('form.html', {
        'form': form;
    }

form.save() сохраняет загруженный файл вместе со всеми другими полями, так как вы включили в него конструктор request.FILES. В ваших моделях вы должны определить подкласс FooForm класса ModelForm следующим образом:

class FooForm(ModleForm):
    Meta:
        model = Foo

... где Foo - подкласс модели, который описывает данные, которые вы хотите сохранить настойчиво.