Django - upload de arquivo

Geralmente, é útil para um aplicativo da web poder carregar arquivos (foto de perfil, músicas, pdf, palavras ...). Vamos discutir como fazer upload de arquivos neste capítulo.

Carregando uma imagem

Antes de começar a brincar com uma imagem, certifique-se de ter a Python Image Library (PIL) instalada. Agora, para ilustrar o upload de uma imagem, vamos criar um formulário de perfil, em nosso myapp / forms.py -

#-*- coding: utf-8 -*-
from django import forms

class ProfileForm(forms.Form):
   name = forms.CharField(max_length = 100)
   picture = forms.ImageFields()

Como você pode ver, a principal diferença aqui é apenas o forms.ImageField. ImageField irá certificar-se de que o arquivo carregado é uma imagem. Caso contrário, a validação do formulário falhará.

Agora vamos criar um modelo de "Perfil" para salvar nosso perfil carregado. Isso é feito em myapp / models.py -

from django.db import models

class Profile(models.Model):
   name = models.CharField(max_length = 50)
   picture = models.ImageField(upload_to = 'pictures')

   class Meta:
      db_table = "profile"

Como você pode ver para o modelo, o ImageField tem um argumento obrigatório: upload_to. Isso representa o local no disco rígido onde suas imagens serão salvas. Observe que o parâmetro será adicionado à opção MEDIA_ROOT definida em seu arquivo settings.py.

Agora que temos o formulário e o modelo, vamos criar a visualização em myapp / views.py -

#-*- coding: utf-8 -*-
from myapp.forms import ProfileForm
from myapp.models import Profile

def SaveProfile(request):
   saved = False
   
   if request.method == "POST":
      #Get the posted form
      MyProfileForm = ProfileForm(request.POST, request.FILES)
      
      if MyProfileForm.is_valid():
         profile = Profile()
         profile.name = MyProfileForm.cleaned_data["name"]
         profile.picture = MyProfileForm.cleaned_data["picture"]
         profile.save()
         saved = True
   else:
      MyProfileForm = Profileform()
		
   return render(request, 'saved.html', locals())

A parte a não perder é que há uma mudança ao criar um ProfileForm, adicionamos um segundo parâmetro: request.FILES. Caso contrário, a validação do formulário irá falhar, dando uma mensagem que diz que a imagem está vazia.

Agora, só precisamos do saved.html modelo e o profile.html modelo, para o formulário e a página de redirecionamento -

myapp/templates/saved.html -

<html>
   <body>
   
      {% if saved %}
         <strong>Your profile was saved.</strong>
      {% endif %}
      
      {% if not saved %}
         <strong>Your profile was not saved.</strong>
      {% endif %}
      
   </body>
</html>

myapp/templates/profile.html -

<html>
   <body>
   
      <form name = "form" enctype = "multipart/form-data" 
         action = "{% url "myapp.views.SaveProfile" %}" method = "POST" >{% csrf_token %}
         
         <div style = "max-width:470px;">
            <center>  
               <input type = "text" style = "margin-left:20%;" 
               placeholder = "Name" name = "name" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
               <input type = "file" style = "margin-left:20%;" 
                  placeholder = "Picture" name = "picture" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
            
               <button style = "border:0px;background-color:#4285F4; margin-top:8%; 
                  height:35px; width:80%; margin-left:19%;" type = "submit" value = "Login" >
                  <strong>Login</strong>
               </button>
               
            </center>
         </div>
         
      </form>
      
   </body>
</html>

Em seguida, precisamos de nosso par de URLs para começar: myapp / urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns(
   'myapp.views', url(r'^profile/',TemplateView.as_view(
      template_name = 'profile.html')), url(r'^saved/', 'SaveProfile', name = 'saved')
)

Ao acessar "/ myapp / profile", obteremos o seguinte template profile.html renderizado -

E na postagem do formulário, o modelo salvo será renderizado -

Temos um exemplo de imagem, mas se você quiser fazer upload de outro tipo de arquivo, não apenas imagem, basta substituir o ImageField no modelo e no formulário com FileField.