English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Загрузка файлов Django

For web applications, it is usually very useful to be able to upload files (images, songs, PDF format, text ...). Let's discuss in this section how to use Django to upload files.

Upload images

Before starting to develop image upload, make sure that the Python image library (PIL) is already installed. Now let's explain how to upload images, let's create a configuration file format, in myapp/forms.py -

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
# -*- coding: utf-8 -*-
 from django import forms
 class ProfileForm(forms.Form):
    name = forms.CharField(max_length=100)
    picture = forms.ImageFields()

正如你所看到的,这里的主要区别仅仅是 forms.ImageField。ImageField字段将确保上传的文件是一个图像。如果不是,格式验证将失败。

现在,让我们创建一个 "Profile" 模型,以保存上传的资料。在 myapp/models.py -

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
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 使用强制性参数:upload_to. 这表示硬盘驱动器,图像保存所在的地方。注意,该参数将被添加到 settings.py文件中定义的MEDIA_ROOT选项。

现在我们有表单和模型,让我们来创建视图,在 myapp/views.py -

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
# -*- 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.htmll', locals())

Не пропустите这部分, создайте ProfileForm и внесли некоторые изменения, добавили второй параметр: request.FILES. Если форма не будет проверена, появится сообщение, что изображение пусто.

Теперь нам нужно только шаблоны saved.htmll и profile.htmll, форму и страницу редиректа−

myapp/templates/saved.htmll −

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
<html>
    <body>
       {% if saved %}
          <strong>Ваш профиль был сохранен.</strong>
       {% endif %}
       {% if not saved %}
          <strong>Ваш профиль не был сохранен.</strong>
       {% endif %}
    </body>
 </html>

myapp/templates/profile.htmll −

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
<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 = "Вход" >
                   <strong>Вход</strong>
                </button>
             </center>
          </div>
       </form>
    </body>
 </html>

Далее, нам нужно настроить адреса для начала: myapp/urls.py

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
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.htmll', url(r'^saved/', 'SaveProfile', name='saved')
 )

Когда вы переходите на " /myapp/profile " , мы получаем следующий шаблон profile.htmll −

После форматирования шаблона, сохраненный шаблон будет отображаться следующим образом −

Здесь мы рассказываем только о примере загрузки изображений, но если вы хотите загрузить другой тип файла, просто замените ImageField в этих двух моделях и FileField в форме.