Upload de arquivo - renomear foto dinamicamente

470 views
Skip to first unread message

Gustavo Henrique

unread,
May 25, 2009, 10:15:08 AM5/25/09
to Django Brasil
Tenho um ModelForm com um campo para upload de fotos e gostaria de
saber como posso renomear dinamicamente a foto para <id do
objeto>.<extensao>.
O codigo abaixo funciona apenas depois que o objeto foi criado, ou
seja, quando vou editar os dados do cliente. O problema é que na hora
do cadastro nao consigo obter o id, entao a funcao retorna None:

class Produto(models.Model):
def _get_file_path_(self, filename):
"""Renomeia a imagem para <id_do_objeto>.extensao"""
dir = "%s/files/produtos" % settings.MEDIA_ROOT
arquivo = self.id
extensao = filename.split('.')[-1]
foto = "%s/%s.%s" % (dir, arquivo, extensao)
if os.path.exists(foto):
os.remove(foto)
return foto

foto = models.ImageField(upload_to=_get_file_path_, blank=True,
null=True)

Entao tentei alterar o metodo save. Consegui salvar no banco do jeito
que eu quero porem nao alterou o nome do arquivo:

def save(self):
if self.foto:
extensao = str(self.foto).split('.')[-1]
self.foto = "%s/files/%s.%s" % (settings.MEDIA_ROOT, str
(self.id), extensao)
for field in self._meta.fields:
if field.name == 'foto':
field.upload_to = self.foto
super(Produto, self).save()


Um abraço!

Gustavo Henrique

unread,
May 25, 2009, 1:24:47 PM5/25/09
to Django Brasil
Não sei se a melhor opcao, mas funcionou:

def save(self):
super(Produto, self).save()
if self.foto:
arquivo = str(self.foto)
extensao = str(arquivo).split('.')[-1]
self.foto = "%s/files/produtos/%s.%s" %
(settings.MEDIA_ROOT, str(self.id), extensao)
if os.path.exists(settings.MEDIA_ROOT+'/'+arquivo):
os.rename(settings.MEDIA_ROOT+'/'+arquivo, str(self.foto))
super(Produto, self).save()


chamei o metodo save() no inicio para assim conseguir o id do objeto.
Nesse caso são feitos 2 acessos ao banco de dados. O que eu estava
procurando mesmo é uma forma alternativa "menos gambiarra" mas acho
que não tem como, uma vez que quem gera o id é o proprio banco de
dados.


--
Gustavo Henrique
Site: http://www.gustavohenrique.net
Blog: http://blog.gustavohenrique.net

Rafaela S. Sacconi

unread,
Jan 29, 2013, 2:16:37 PM1/29/13
to django...@googlegroups.com
Boa tarde.

Segue código que usei para alterar o nome da imagem antes de salvar o registro no banco.

class Imagem(models.Model):
    arquivo = models.ImageField(upload_to=u'pasta_destino')

    def save(self, *args, **kwargs):
        if not self.pk:
            self.arquivo.name = u'pasta_destino/novo_nome.%s' % self.arquivo.name.split('.')[1] # Pegando a extensão da img
        super(Imagem, self).save(*args, **kwargs)

Leonardo S

unread,
Jan 29, 2013, 10:18:08 PM1/29/13
to django...@googlegroups.com
Rafaela,

Outra sugestão é passar direto uma função para o upload_to:

def path(self, filename):
        extension = os.path.splitext(filename)[-1]
        return '%s/new_name%s' % ('destination_folder', extension,)

image = models.ImageField(upload_to=path, blank=True, null=True)


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Django Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para django-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Reply all
Reply to author
Forward
0 new messages