Django - Mengunggah File

Secara umum berguna untuk aplikasi web untuk dapat mengunggah file (gambar profil, lagu, pdf, kata-kata .....). Mari kita bahas cara mengunggah file di bab ini.

Mengupload Gambar

Sebelum mulai bermain dengan gambar, pastikan Anda telah menginstal Python Image Library (PIL). Sekarang untuk mengilustrasikan mengunggah gambar, mari buat formulir profil, di myapp / forms.py -

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

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

Seperti yang Anda lihat, perbedaan utama di sini hanyalah forms.ImageField. ImageField akan memastikan file yang diunggah adalah sebuah gambar. Jika tidak, validasi formulir akan gagal.

Sekarang mari buat model "Profil" untuk menyimpan profil yang kita unggah. Ini dilakukan di 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"

Seperti yang Anda lihat untuk modelnya, ImageField mengambil argumen wajib: upload_to. Ini mewakili tempat di hard drive tempat gambar Anda akan disimpan. Perhatikan bahwa parameter akan ditambahkan ke opsi MEDIA_ROOT yang ditentukan di file settings.py Anda.

Sekarang setelah kita memiliki Formulir dan Model, mari buat tampilan, di 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())

Bagian yang tidak boleh dilewatkan adalah, ada perubahan saat membuat ProfileForm, kami menambahkan parameter kedua: request.FILES. Jika tidak lolos validasi formulir akan gagal, memberikan pesan bahwa gambar kosong.

Sekarang, kami hanya membutuhkan file saved.html template dan profile.html template, untuk formulir dan halaman pengalihan -

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>

Selanjutnya, kita membutuhkan pasangan URL kita untuk memulai: 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')
)

Saat mengakses "/ myapp / profile", kita akan mendapatkan template profile.html berikut dirender -

Dan pada form post, template yang disimpan akan dirender -

Kami memiliki contoh untuk gambar, tetapi jika Anda ingin mengunggah jenis file lain, bukan hanya gambar, ganti saja ImageField di Model dan Formulir dengan FileField.