1
resposta

Passar o path da imagem com um dos próprios campos do model

No caso foi passado como criar o path de upload com base no dia, mes e ano, mas caso eu queria além disso utilizar o um dos campos do model ou outra informação direto da página como parâmetro?

Exemplo

class Receita(models.Model):
    nome = models.CharField[...]
    tipo = models.CharField[...]
    foto = models.ImageField(upload_to=tipo+'%d/%m/%Y', blank=True)

Agradeço desde já a atenção, boa noite!

1 resposta

Olá, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Para termos acesso a um atributo dentro de um modelo criado no contexto de ImageField, será necessário uma função auxiliar para retornar o endereço completo que desejamos salvar o arquivo.

Por padrão, o atributo upload_to do campo ImageField aceitará uma função como parâmetro, desde que a mesma tenha a seguinte sintaxe:

def nome_da_funcao(instance, filename):
     pass

Onde, instance é a classe do modelo que estamos passando como referência - neste caso, Receita e filename é o nome do arquivo que foi originalmente dado à imagem.

Dito isso, a função para formatar o endereço, ficará da seguinte forma no arquivo receitas/models.py:

def endereco_imagem(instance, filename):
    data = datetime.now().date().strftime('/%d/%m/%Y')
    return '{}/fotos/{}/{}'.format(instance.categoria, data, filename)

E dentro do campo ImageField, passaremos a função para o atributo upload_to:

foto_receita = models.ImageField(upload_to=endereco_imagem, blank=True)

Com essa modificação, você conseguirá salvar as imagens em pastas separadas por categoria. Caso queira que outro atributo seja usado como nome da pasta, basta trocar na função endereco_imagem o atributo instance.categoria, pelo nome de outro atributo.

Caso queira conhecer um pouco mais sobre o atributo upload_to, recomendo a leitura da documentação do Django, podendo ser acessada pelo link abaixo:

A documentação está em inglês, mas caso tenha dificuldades com o idioma, recomendo que utilize o tradutor do próprio navegador.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!