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á?