3
respostas

[Dúvida] Nome do diretório foto

Olá! Quando eu coloco o codigo:

foto = models.ImageField(upload_to="fotos/%Y/%m/%d", blank=True)

O nome de um dos diretórios fica como "fotos", existe um modo desse diretorio ficar com o nome do objeto que foi criado ? Usando self.nome talves ?

3 respostas

Bom dia, Anderson! Tudo bem com você?

No código que você compartilhou, o diretório para o upload das fotos é definido como "fotos/%Y/%m/%d". Isso significa que as fotos serão armazenadas em um diretório chamado "fotos", seguido do ano, mês e dia em que foram enviadas.

Se você deseja que o diretório seja nomeado de acordo com o objeto criado, você pode usar o valor do atributo "nome" do objeto no momento do upload. Por exemplo:

import os

def get_upload_path(instance, filename):
    # Obtém o nome do objeto
    nome_objeto = instance.nome
    # Obtém a extensão do arquivo
    extensao = os.path.splitext(filename)[1]
    # Define o caminho de upload como "fotos/nome_objeto.extensao"
    return f"fotos/{nome_objeto}{extensao}"

class SuaModel(models.Model):
    nome = models.CharField(max_length=100)
    foto = models.ImageField(upload_to=get_upload_path, blank=True)

Dessa forma, o diretório para o upload das fotos será nomeado conforme o objeto criado. Por exemplo, se o objeto tiver o nome "foto1" e o arquivo for "imagem.jpg", o caminho de upload será "fotos/foto1.jpg".

Espero ter ajudado e bons estudos!

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

Olá Armano! Não era exatamente isso que eu queria, na verdade eu queria criar dentro o diretório fotos, um outro diretório com o nome do objeto e dentro desse diretório, mais um com o ano e etc, até a imagem com o nome original mesmo. O caminho seria algo do tipo fotos/nome_objeto/ano/mes/dia Não sei se consegui me explicar bem...

Usando o que você falou e um pouco do ChatGpt eu fiz a seguinte alteração:

def get_upload_path(instance, filename):
    # Obtém o nome do objeto
    nome_objeto = instance.nome
    # Obtém a extensão do arquivo
    extensao = filename.split('.')[-1]
    # Define o caminho de upload como "fotos/nome_objeto.extensao"
    return os.path.join("fotos", instance.nome, filename)
    
class SuaModel(models.Model):
    nome = models.CharField(max_length=100)
    foto = models.ImageField(upload_to=get_upload_path, blank=True)	
    

Assim eu conseguir fazer o caminho fotos/nome_objeto. Não entendi exatamente por que funcionou e também não conseguir criar os outros diretórios que gostaria, com ano, mês e dia

Olá de novo rs !

Consegui depois de muito teste e chatgpt além de olhar aqui no forum, minha solução foi :

def get_upload_path(instance, filename):
    # Obtém o nome do objeto
    nome_objeto = instance.nome
    # Obtém a extensão do arquivo
    extensao = filename.split('.')[-1]
    # Obtém a data atual
    data_atual = datetime.now()
    # Define o caminho de upload como "nome_objeto/ano/mes/dia/nome_do_arquivo.extensao"
    caminho = os.path.join(nome_objeto, data_atual.strftime('Ano %Y/ Mês %m/ Dia %d'))
    return os.path.join(caminho, f"{filename}.{extensao}")

class SuaModel(models.Model):
    nome = models.CharField(max_length=100)
    foto = models.ImageField(upload_to=get_upload_path, blank=True)

Confeso que a linha :

# Obtém a extensão do arquivo
    extensao = filename.split('.')[-1]

Ainda não entendo o que faz exatamente, mas está funcionando rs