بخش های اصلی

آموزش Django

Django – آپلود فایل

معمولاً در برنامه‌های وب استفاده از آپلودِ فایل رایج هستش (برای عکس‌ پروفایل، آهنگ‌ها، pdf، فایل‌های word و...).  در ادامه راجع به نحوه‌ی آپلود فایل‌ها توضیح میدیم.

آپلود یک عکس

قبل از شروع کار با عکس‌ها، باید اطمینان حاصل کنین که Python Image Library (PIL) را نصب کرده‌این. برای نشان دادن نحوه‌ی آپلود عکس، یک فرمِ پروفایل در myapp/forms.py ایجاد می‌کنیم:

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

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

همانطور که میبینین، تفاوت اصلی فقط forms.ImageField است. ImageField تضمین می‌کنه که فایل آپلود شده عکسِه. اگه فایل آپلود شده عکس نباشه، اعتبارسنجی فرم ناموفق خواهد بود.

اکنون برای ذخیره‌ی پروفایل آپلود شده یک مدل (model) به نام “profile” ایجاد می‌کنیم. برای انجام این‌کار 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"

همانطور که مشاهده می‌کنین ImageField در مدل (model) یک آرگومان اجباری میگیره: upload_to. این آرگومان مکانی از هارد دیسک را نشان میده که عکس‌ها در آن ذخیره میشن. در نظر داشته باشین که این پارامتر به آپشنِ MEDIA_ROOT که در فایلِ settings.py تعریف شده، اضافه میشه.

حالا که فرم و مدل (Model) را داریم، view را در 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())

هنگام ایجادِ ProfileForm تغییری ایجاد کرده‌ایم؛ یک پارامتر دوم به آن اضافه کرده‌ایم: request.FILES. اگه این پارامتر پاس داده نشه، اعتبارسنجی فرم ناموفق خواهد بود و پیامی مبنی بر این‌که عکس خالیِه داده خواهد شد.

اکنون برای فرم و صفحه‌ای که به آن تغییر مسیر (redirection) داده میشه، فقط به saved.html template و profile.html template نیاز داریم.

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>

سپس، برای شروع به جفت URLها نیاز داریم : 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')
)

اگه به "/myapp/profile" برین، profile.html template رندِر شده‌ای بصورت زیر مشاهده خواهید کرد :

uploading image

و هنگام post شدن فرم، template ذخیره شده بصورت زیر رِندِر میشه –

form post template

همانطور که دیدین، در این بخش یک نمونه‌ی آپلود، برای عکس ایجاد کردیم، اگه می‌خواین فایل دیگه‌ای به جز عکس آپلود کنین فقط در Model و فرم،  ImageField را با FileField جایگزین کنین.

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد