Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

MultiValueDictKeyError ao carregar imagem no banco

Olá, o problema é o seguinte:

Quando eu coloco um arquivo no input type="file" e envio o formulario a imagem é enviada normalmente, mas quando eu não seleciono nenhuma imagem para enviar, da erro de multivalue.

Já tentei:

  • colocar no model o blank=True
  • colocar no model = null=True
  • setar um valor default para pegar uma imagem ja existente

Entretanto nada disso dá certo e não acho uma resposta melhor na internet. Alguém já passou por isso, como resolvo?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
10 respostas

Oi Raul, como vai?

Não sei como você está pegando esse dado da requisição, mas como é um dicionário, tente verificar se há aquela chave na requisição, algo como:

if 'imagem' in request.FILES:
    pegue o endereço da imagem

Qualquer dúvida estou por aqui, a gente vai conversando.

Abraços!

Ainda não deu :(

if 'foto_aluno' not in request.FILES:

        cadastra_novo_aluno1=Aluno.objects.create(identificador_usuario=identificador_usuario,nome_aluno=nome_aluno,        data_nascimento_aluno=data_nascimento_aluno,sexo_aluno=sexo_aluno,         responsavel_aluno=responsavel_aluno,telefone_emergencia_1=telefone_emergencia_1,
        telefone_emergencia_2=telefone_emergencia_2,patologias=patologias,cpf_aluno=cpf_aluno,rg_aluno=rg_aluno,endereco_aluno=endereco_aluno,
        telefone_aluno=telefone_aluno,email_aluno=email_aluno,
        data_matricula_aluno=data_matricula_aluno,situacao_aluno=situacao_aluno)

        cadastra_novo_aluno1.save()
    else:

        cadastra_novo_aluno2= Aluno.objects.create(identificador_usuario=identificador_usuario,nome_aluno=nome_aluno,            data_nascimento_aluno=data_nascimento_aluno,sexo_aluno=sexo_aluno,foto_aluno=foto_aluno,
        responsavel_aluno=responsavel_aluno,telefone_emergencia_1=telefone_emergencia_1,
        telefone_emergencia_2=telefone_emergencia_2,patologias=patologias,cpf_aluno=cpf_aluno,rg_aluno=rg_aluno,endereco_aluno=endereco_aluno,
        telefone_aluno=telefone_aluno,email_aluno=email_aluno,
        data_matricula_aluno=data_matricula_aluno,situacao_aluno=situacao_aluno)

        cadastra_novo_aluno2.save()

        messages.success(request,'Aluno cadastrado com sucesso')

Só ta cadastrando no banco se tiver a foto :(. Não sei mais o que posso fazer pra resolver.

Raul é difícil dizer com certeza sem analisar seu código por completo, então vou te fazer algumas perguntas, tá bom?

No seu modelo o campo foto_aluno está como opcional(blank=True, null=True) ?

Faça um debug colocando um print dentro dessa condição if 'foto_aluno' not in request.FILES: e veja no terminal se está entrando nesse if. Como está o seu modelo? E o seu input no html, como está?

A gente vai conversando, fico no aguardo

class Aluno(models.Model):

identificador_usuario=models.CharField(max_length=500,blank=True)

nome_aluno=models.CharField(max_length=200)

data_nascimento_aluno=models.DateField(default=datetime.today)

sexo_aluno=models.CharField(max_length=10,default='Outros', blank=True)

foto_aluno=models.ImageField(upload_to='alunos/%m/%Y/',blank=True,null=True) 

if 'foto_aluno' not in request.FILES:

        print('Está dando Erro aqui')

else: print('Tudo na normalidade')

Rodei esse na view e continua dando a mensagem de erro.

Raul, consegui simular o erro pelo trecho que me mostrou =)

Como dito, a ideia é que façamos o if para verificar se há a chave na requisição, o nome dessa chave é o que está escrito no atributo name no input do seu html. Vou deixar um exemplo logo abaixo.

No modelo, a imagem fica da seguinte forma:

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

Já na view de criação teremos algo como:

def cria_receita(request):

    if request.method == 'POST':
        nome_receita = request.POST['nome_receita']
        ingredientes = request.POST['ingredientes']
        modo_preparo = request.POST['modo_preparo']
        tempo_preparo = request.POST['tempo_preparo']
        rendimento = request.POST['rendimento']
        categoria = request.POST['categoria']
        if 'publicada' in request.POST:
            publicada = request.POST['publicada']
        else:
            publicada = False

        user = get_object_or_404(User, pk=request.user.id)

        if 'foto_receita' in request.FILES:
            foto_receita = request.FILES['foto_receita']
            receita = Receita.objects.create(
                pessoa=user, 
                nome_receita=nome_receita, 
                ingredientes=ingredientes,
                modo_preparo=modo_preparo, 
                tempo_preparo=tempo_preparo, 
                rendimento=rendimento, 
                categoria=categoria,
                foto_receita=foto_receita,
                publicada=publicada
            )
        else:
            print("a requisição nao tem foto então não vamos passar o atributo foto_receita")
            receita = Receita.objects.create(
                pessoa=user, 
                nome_receita=nome_receita, 
                ingredientes=ingredientes,
                modo_preparo=modo_preparo, 
                tempo_preparo=tempo_preparo, 
                rendimento=rendimento, 
                categoria=categoria,
                publicada=publicada
            ) 

        receita.save()
        return redirect('dashboard')
    else:
        return render(request, 'receitas/cria_receita.html')

Já no html, dentro de uma tag form usando method="post" enctype="multipart/form-data" o campo do input da imagem fica da seguinte forma:

<div class="col-12 col-lg-3">
 <label for="file"><b>Foto</b></label>
<input type="file" class="form-control" name="foto_receita">         
 </div>

Verifique se através desse exemplo você consegue realizar o procedimento por aí. Qualquer coisa upe seu código no drive e deixe o link na resposta para que eu possa testar por aqui e verificar o que está acontecendo no seu caso.

Fico no aguardo, estou por aqui, tá?

solução!

Consegui resolver finalmente, dessa forma:

if 'foto_aluno' not in request.FILES:

        foto_aluno=''

    else:
        foto_aluno=request.FILES['foto_aluno']


    cadastra_aluno=Aluno.objects.create(identificador_usuario=user,nome_aluno=nome_aluno,data_nascimento_aluno=data_nascimento_aluno,
    sexo_aluno=sexo_aluno,foto_aluno=foto_aluno,responsavel_aluno=responsavel_aluno,telefone_emergencia_1=telefone_emergencia_1,
    telefone_emergencia_2=telefone_emergencia_2,patologias=patologias,cpf_aluno=cpf_aluno,rg_aluno=rg_aluno,       endereco_aluno=endereco_aluno,telefone_aluno=telefone_aluno,email_aluno=email_aluno,data_matricula_aluno=data_matricula_aluno,

situacao_aluno=situacao_aluno)

  cadastra_aluno.save()

  return redirect('form_matriculas')

Raul, fico feliz que tenha dado certo =)

Qualquer dúvida poste aqui no fórum que sempre tentaremos te ajudar, tá bom?

Grande abraço!

Agradeço a você, usei uma parte do que você me sugeriu. Muito obrigado por sempre me ajudar.