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?

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.