Django - Tải lên tệp

Nó thường hữu ích cho một ứng dụng web để có thể tải lên các tệp (ảnh hồ sơ, bài hát, pdf, lời nói .....). Hãy thảo luận về cách tải tệp lên trong chương này.

Tải lên hình ảnh

Trước khi bắt đầu chơi với một hình ảnh, hãy đảm bảo rằng bạn đã cài đặt Thư viện Hình ảnh Python (PIL). Bây giờ để minh họa việc tải lên một hình ảnh, hãy tạo một biểu mẫu tiểu sử, trong myapp / form.py -

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

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

Như bạn có thể thấy, sự khác biệt chính ở đây chỉ là forms.ImageField. ImageField sẽ đảm bảo tệp tải lên là hình ảnh. Nếu không, xác thực biểu mẫu sẽ không thành công.

Bây giờ chúng ta hãy tạo một mô hình "Hồ sơ" để lưu hồ sơ đã tải lên của chúng ta. Điều này được thực hiện trong 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"

Như bạn có thể thấy đối với mô hình, ImageField có đối số bắt buộc: upload_to. Điều này thể hiện vị trí trên ổ cứng nơi hình ảnh của bạn sẽ được lưu. Lưu ý rằng tham số sẽ được thêm vào tùy chọn MEDIA_ROOT được xác định trong tệp settings.py của bạn.

Bây giờ chúng ta đã có Biểu mẫu và Mô hình, hãy tạo chế độ xem, trong 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())

Phần không thể bỏ lỡ là, có một thay đổi khi tạo ProfileForm, chúng tôi đã thêm một tham số thứ hai: request.FILES. Nếu không được thông qua, xác thực biểu mẫu sẽ không thành công, đưa ra thông báo cho biết hình ảnh trống.

Bây giờ, chúng ta chỉ cần saved.html mẫu và profile.html mẫu, cho biểu mẫu và trang chuyển hướng -

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>

Tiếp theo, chúng tôi cần cặp URL của mình để bắt đầu: 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')
)

Khi truy cập "/ myapp / profile", chúng tôi sẽ nhận được mẫu profile.html sau được hiển thị -

Và trên bài đăng biểu mẫu, mẫu đã lưu sẽ được hiển thị -

Chúng tôi có một mẫu cho hình ảnh, nhưng nếu bạn muốn tải lên một loại tệp khác, không chỉ hình ảnh, chỉ cần thay thế ImageField ở cả Model và Form với FileField.