Django1.0でのアップロード画像の保存

110 views
Skip to first unread message

hirano....@gmail.com

unread,
Jun 22, 2009, 3:15:44 AM6/22/09
to django-ja
はじめまして、平野と申します。

Django1.0を使って画像をアップロードする仕掛けを作っています。
そこで、ImageFieldを用いた画像の保存処理を行わせたいのですが、
うまくいかず詰まってしまっています。

自分はこうやったよーと言ったアドバイスを頂ければと思い投稿しました。
以下、状況となります。
http://d.hatena.ne.jp/Lambda_groove/より)

========================================================

Django1.0を使った画像のアップロードで詰まった。

何がダメだったかまとめてとりあえず対策を調査。

どこかが間違っているコード。

views.pyの抜粋

if request.method == 'POST':
form = ArticleSubmitForm(request.POST, request.FILES)

if form.is_valid():
form.full_clean()
cleaned_data = form.cleaned_data

pub_date = forms.DateTimeField()
cleaned_pub_date = pub_date.clean(datetime.datetime.now())

article = Article()
article.subject = cleaned_data["subject"]
article.body = cleaned_data["body"]
article.photo_name = cleaned_data["photo_name"]
article.image = cleaned_data["image"]
article.pub_date = cleaned_pub_date

article.save()

views.pyの抜粋の続き

class ArticleSubmitForm(forms.Form):
subject = forms.CharField(label="タイトル",
max_length=200,
required=True)

body = forms.CharField(label="本文",
max_length=2000,
widget=forms.Textarea,
required=True)

photo_name = forms.CharField(label="写真の説明",
max_length=200,
required=True)

image = forms.ImageField(label="ファイル",
widget=forms.FileInput,
required=True)

models.py

from django.db import models

class Article(models.Model):
subject = models.CharField(max_length=200)
body = models.TextField(max_length=2000)
photo_name = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
image = models.ImageField(upload_to="img")

class Admin:
list_display = ("subject",
"body",
"photo_name",
"pub_date",
"image",
)

状態。

登録処理自体は走る。

そして画像がsettings.pyのMEDIA_ROOT/imgに保存されない。

ディスクの中身を片っ端から探したがどこにも画像はいない。

保存できてないのに例外すら出ないという事はさておき、

バグ取りのとっかかりすらない状態。

対策。

* リクエスト側の<input type="file" />から送信されるファイルデータは、必ず<form
enctype="multipart/form-data">から送らせること。基本だが忘れてた。
* PILはインストールしてあるか?ないとsyncdbした際エラーが吐かれる。ImageFieldを使いたかったのでインストールし
た。
* A2Cさんのブログのやり方でもダメだった。
* Vistaだからか?と思いLinux環境でも試したがダメ。
* piro_sukeさんのブログのやり方だと、必要なライブラリを配布しているサイトが死んでて試せず。
========================================================

以上、よろしくお願いします。

makoto tsuyuki

unread,
Jun 22, 2009, 11:21:34 AM6/22/09
to django-ja
露木です。
#ModelFormを使いたくない理由があるのかな?

http://djangoproject.jp/doc/ja/1.0/ref/forms/api.html#binding-uploaded-files
http://djangoproject.jp/doc/ja/1.0/topics/http/file-uploads.html#topics-file-uploads

取り急ぎ

On 6月22日, 午後4:15, "hirano.19841...@gmail.com" <hirano.

岩下洋治

unread,
Jul 19, 2009, 10:26:59 PM7/19/09
to django-ja
岩下と申します。
私も同じ事ではまっていたのですが、解決しました。
平野さんのソースだと、以下のように書けば動くと思います。

> article.image = cleaned_data["image"]
uploadobj = cleand_data["image"]
article.image.save( uploadobj.name, uploadobj )

この辺はドキュメントがわかりにくいですよね。

On 6月22日, 午後4:15, "hirano.19841...@gmail.com" <hirano.
19841...@gmail.com> wrote:
Reply all
Reply to author
Forward
0 new messages