Django-file-uploading

提供:Dev Guides
移動先:案内検索

Django-ファイルのアップロード

一般に、Webアプリがファイル(プロフィール写真、曲、pdf、単語など)をアップロードできると便利です。 この章では、ファイルをアップロードする方法について説明します。

画像をアップロードする

画像の再生を開始する前に、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は、アップロードされたファイルが画像であることを確認します。 そうでない場合、フォームの検証は失敗します。

それでは、アップロードしたプロファイルを保存するための「プロファイル」モデルを作成しましょう。 これは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は必須の引数 upload_to を取ります。 これは、画像が保存されるハードドライブ上の場所を表します。 パラメーターは、settings.pyファイルで定義されたMEDIA_ROOTオプションに追加されることに注意してください。

フォームとモデルができたので、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, 'savedl', locals())

見逃してはならない部分は、ProfileFormの作成時に変更があったため、2番目のパラメーター request.FILES を追加したことです。 渡されなかった場合、フォームの検証は失敗し、画像が空であることを示すメッセージが表示されます。

これで、フォームとリダイレクトページに savedl テンプレートと profilel テンプレートが必要になります-

*myapp/templates/savedl* -
<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/profilel* -
<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 = 'profilel')), url(r'^saved/', 'SaveProfile', name = 'saved')
)

「/myapp/profile」にアクセスすると、次のプロファイルテンプレートがレンダリングされます-

画像のアップロード

そして、フォームの投稿で、保存されたテンプレートがレンダリングされます-

フォーム投稿テンプレート

画像のサンプルがありますが、画像だけでなく別の種類のファイルをアップロードする場合は、モデルとフォームの両方の ImageFieldFileField に置き換えてください。