Django - как превратить InMemoryUploadedFile в FieldFile ImageField? - PullRequest
11 голосов
/ 03 февраля 2009

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

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

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

Ответы [ 3 ]

18 голосов
/ 23 февраля 2010

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

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

, где foo - это экземпляр модели, а imagefield - это ImageField.

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

image = form.cleaned_data.get('img')
foo.imagefield.save(image.name, image)
3 голосов
/ 03 февраля 2009

Вы пытаетесь сделать это в 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 в параметрах инициализации.

1 голос
/ 12 февраля 2009

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

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 - это подкласс Model , который описывает данные, которые вы хотите постоянно хранить.

...