简体   繁体   English

如何正确上传图片。 Django

[英]how to upload image correctly. Django

I am building a Django application (run in local) and I am having headaches about uploading files/pictures.我正在构建一个 Django 应用程序(在本地运行),我对上传文件/图片感到头疼。 I have read tons of questions/answers everywhere as well as followed the official doc, but somehow I still have problems.我到处阅读了大量的问题/答案并遵循了官方文档,但不知何故我仍然遇到问题。

In my models.py:在我的 models.py 中:

FuncionarioPathFoto = models.FileField(
        "Foto",
        upload_to = "images/",
        db_column= "FuncionarioPathFoto",
        null= False,
        blank = False
    )

In my views (I'm using inline forms, so the code is big):在我看来(我使用内联 forms,所以代码很大):

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)

I put this in my urls, and settings: urls:我把它放在我的网址和设置中:网址:

if settings.DEBUG:
    urlpatterns += static(
        settings.MEDIA_URL,
        document_root=settings.MEDIA_ROOT,
    )

settings:设置:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

And I already tried to add <form method="POST" enctype="multipart/form-data">我已经尝试添加<form method="POST" enctype="multipart/form-data">

but I was unsuccessful, when submitting my form, that field keeps giving error.但是我没有成功,在提交我的表格时,该字段一直出错。

I tried uploading the file via /admin, and it went to the directory correctly with no errors.我尝试通过 /admin 上传文件,它正确地进入了目录,没有错误。

what can i try to do to solve it?我可以尝试做些什么来解决它?

Let me explain the process of uploading files with Django with my own method.下面我用自己的方法来解释一下用Django上传文件的过程。

If a file is sent to the server, it is kept in request.FILES as temp.如果文件被发送到服务器,它作为临时文件保存在request.FILES中。 You can see it by saying print(request.FILES) .您可以通过说print(request.FILES)来查看它。

First, read the temp data and then load it into the relevant directory with the open function in python.首先读取临时数据,然后加载到python中open的function相关目录下。

For example例如

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'

You need to pass request.FILES in form in views.py您需要在 views.py 中以表单形式传递request.FILES

form = FuncionariosForm(request.POST,request.FILES)

and also need to pass enctype="multipart/form-data" in html form并且还需要以 html 形式传递enctype="multipart/form-data"

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM