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