Django - como você transformar um InMemoryUploadedFile em FieldFile de um ImageField?

votos
11

Eu tenho tentado help(django.db.models.ImageField)e dir(django.db.models.ImageField), olhando para como você pode criar um ImageFieldobjeto a partir de uma imagem que é carregado.

request.FILEStem as imagens como InMemoryUploadedFile, mas eu estou tentando salvar um modelo que contém um ImageField, assim como faço para ligar o InMemoryUploadedFileno ImageField?

Como é que você vai encontrar este tipo de coisa fora? Eu suspeito que as duas classes têm um relacionamento de herança, mas eu teria que fazer muitas dir()ing para saber se eu estava a olhar.

Publicado 03/02/2009 em 03:46
fonte usuário
Em outras línguas...                            


3 respostas

votos
16

Você precisa salvar o InMemoryUploadedFileao ImageFieldinvés de 'transformar' o em um ImageField:

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

onde foo é a instância de modelo, e ImageField é a ImageField.

Alternativamente, se você está puxando a imagem fora de um formulário:

image = form.cleaned_data.get('img')
foo.imagefield.save(image.name, image)
Respondeu 23/02/2010 em 11:44
fonte usuário

votos
3

Você está tentando fazê-lo em ModelForm?

Isto é como eu fiz para o campo de arquivo

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()

Você pode tomá-lo como exemplo e procurar na fonte que classe InMemoryUploadedFile precisa de parâmetros de inicialização.

Respondeu 03/02/2009 em 05:40
fonte usuário

votos
1

Você poderia implementar um formulário com um campo de upload de arquivo usando instâncias de formulário, aqui é a vista:

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 () salva o arquivo enviado, juntamente com todos os outros campos como você incluídos request.FILES argumento em seu construtor. Em seus modelos que você tem que definir FooForm subclasse de ModelForm classe como este:

class FooForm(ModleForm):
    Meta:
        model = Foo

... onde Foo é a subclasse de modelo , que descreve os dados que você deseja armazenar persistentemente.

Respondeu 12/02/2009 em 21:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more