Django - Téléchargement de fichiers

Il est généralement utile pour une application web de pouvoir télécharger des fichiers (photo de profil, chansons, pdf, mots .....). Voyons comment télécharger des fichiers dans ce chapitre.

Télécharger une image

Avant de commencer à jouer avec une image, assurez-vous que la bibliothèque d'images Python (PIL) est installée. Maintenant, pour illustrer le téléchargement d'une image, créons un formulaire de profil, dans notre myapp / forms.py -

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

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

Comme vous pouvez le voir, la principale différence ici est juste le forms.ImageField. ImageField s'assurera que le fichier téléchargé est une image. Sinon, la validation du formulaire échouera.

Créons maintenant un modèle "Profil" pour enregistrer notre profil téléchargé. Ceci est fait dans 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"

Comme vous pouvez le voir pour le modèle, ImageField prend un argument obligatoire: upload_to. Cela représente l'endroit sur le disque dur où vos images seront enregistrées. Notez que le paramètre sera ajouté à l'option MEDIA_ROOT définie dans votre fichier settings.py.

Maintenant que nous avons le formulaire et le modèle, créons la vue, dans 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())

La partie à ne pas manquer est, il y a un changement lors de la création d'un ProfileForm, nous avons ajouté un second paramètre: request.FILES. Si ce n'est pas passé, la validation du formulaire échouera, donnant un message indiquant que l'image est vide.

Maintenant, nous avons juste besoin du saved.html modèle et le profile.html template, pour le formulaire et la page de redirection -

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>

Ensuite, nous avons besoin de notre paire d'URL pour commencer: 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')
)

Lors de l'accès à "/ myapp / profile", nous obtiendrons le modèle profile.html suivant rendu -

Et lors de la publication du formulaire, le modèle enregistré sera rendu -

Nous avons un exemple d'image, mais si vous souhaitez télécharger un autre type de fichier, pas seulement une image, remplacez simplement le ImageField dans le modèle et la forme avec FileField.