Как правильно загрузить изображение. Django
Я создаю приложение Django (запускаемое локально) и у меня головная боль по поводу загрузки файлов/картинок. Я прочитал тонны вопросов/ответов везде, а также следовал официальной документации, но почему-то у меня все еще проблемы.
В моем models.py:
FuncionarioPathFoto = models.FileField(
"Foto",
upload_to = "images/",
db_column= "FuncionarioPathFoto",
null= False,
blank = False
)
В моих представлениях (я использую inline формы, поэтому код большой):
def create_funcionario(request):
if request.method == "GET":
form = FuncionariosForm
form_funcionarioadicional_factory = inlineformset_factory(Funcionarios, FuncionarioAdicional, form=FuncionarioAdicionalForm, extra=1)
form_funcionarioaux_factory = inlineformset_factory(Funcionarios, FuncionarioAux, form=FuncionarioAuxForm, extra=1)
form_funcionarioarquivo_factory = inlineformset_factory(Funcionarios, FuncionarioArquivo, form=FuncionarioArquivoForm, extra=1)
form_funcionarioadicional = form_funcionarioadicional_factory()
form_funcionarioaux = form_funcionarioaux_factory()
form_funcionarioarquivo = form_funcionarioarquivo_factory()
context = {
'form': form,
'form_funcionarioadicional': form_funcionarioadicional,
'form_funcionarioaux': form_funcionarioaux,
'form_funcionarioarquivo': form_funcionarioarquivo,
}
return render(request, '../templates/funcionarios/form_funcionarios.html', context)
elif request.method == "POST":
form = FuncionariosForm(request.POST)
form_funcionarioadicional_factory = inlineformset_factory(Funcionarios, FuncionarioAdicional, form=FuncionarioAdicionalForm)
form_funcionarioaux_factory = inlineformset_factory(Funcionarios, FuncionarioAux, form=FuncionarioAuxForm)
form_funcionarioarquivo_factory = inlineformset_factory(Funcionarios, FuncionarioArquivo, form=FuncionarioArquivoForm)
form_funcionarioadicional = form_funcionarioadicional_factory(request.POST)
form_funcionarioaux = form_funcionarioaux_factory(request.POST)
form_funcionarioarquivo = form_funcionarioarquivo_factory(request.POST)
if form.is_valid() and form_funcionarioadicional.is_valid() and form_funcionarioaux.is_valid() and form_funcionarioarquivo.is_valid():
funcionario = form.save()
form_funcionarioadicional.instance = funcionario
form_funcionarioaux.instance = funcionario
form_funcionarioarquivo.instance = funcionario
form_funcionarioadicional.save()
form_funcionarioaux.save()
form_funcionarioarquivo.save()
messages.success(request, "Funcionário adicionado com sucesso!")
return redirect(reverse('lista_funcionarios'))
else:
context = {
'form': form,
'form_funcionarioadicional': form_funcionarioadicional,
'form_funcionarioaux': form_funcionarioaux,
'form_funcionarioarquivo': form_funcionarioarquivo,
}
return render(request, '../templates/funcionarios/form_funcionarios.html', context)
Я поместил это в свои url и настройки: urls:
if settings.DEBUG:
urlpatterns += static(
settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT,
)
настройки:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
И я уже пытался добавить <form method="POST" enctype="multipart/form-data">
но у меня ничего не получилось, при отправке формы это поле продолжает выдавать ошибку.
Я попробовал загрузить файл через /admin, и он правильно перешел в каталог без ошибок.
что я могу попытаться сделать, чтобы решить эту проблему?
Позвольте мне объяснить процесс загрузки файлов в Django с помощью моего собственного метода.
Если файл отправляется на сервер, он хранится в request.FILES
как temp. Вы можете увидеть это, сказав print(request.FILES)
.
Сначала прочитайте временные данные, а затем загрузите их в соответствующий каталог с помощью функции open
в python.
Например
img = request.FILES['img'].read()
print(type(img))
open('mypath/name.png','wb').write(img) # Note if output not bytes change to open mode 'w'
Вам необходимо передать request.FILES
в форме в файле views.py
form = FuncionariosForm(request.POST,request.FILES)
а также необходимо передать enctype="multipart/form-data"
в html форме
<form action="/action_page_binary.asp" method="post" enctype="multipart/form-data">
<label for="fname">First name:</label>
<input type="text" id="fname" name="fname"><br><br>
<label for="lname">Last name:</label>
<input type="text" id="lname" name="lname"><br><br>
<input type="submit" value="Submit">
</form>