2011-11-16 9 views
0

私はこれを3日間連続して作業しています。私はウィットの終わりです。私は、このプロセスで正確に何が起こっているのか、実際のデータが各ステップでどのように見えるか(または見えるか)のリテラルを段階的に説明する必要があります。Djangoでのファイルのアップロード/処理

私はImageField()を内部に持つモデルを持っています。私はそのモデルに基づいてフォームを持っています。私はテンプレートにフォームを渡し、そのテンプレートは完成したフォームデータをビューに渡します。次に、要求をバインドします。モデル/フォームのインスタンスにデータをファイル化して保存します。

私がしたいことは、このアップロードされたファイルをユーザーのプロフィール写真として使用することです。モデルに保存する前にサイズを変更したいと思います。

私はデータを検証した後、request.FILES ['file']データを関数に渡しています。この関数の内部でPILがデータを開きます。 PILに問題がないたびに、このデータをInMemoryファイルから直接見ることができます。しかし、私はこの編集されたデータをDjangoがImageField()で探しているものに出力することはできません。私は基本的にこのアップロードされたデータを取り込み、サイズを変更し、名前を変更してからImageField()を使って保存し、そこからDjangoに処理させます。

ビュー:

if request.method == "POST": 
    user_form = EditUserProfile(request.POST, instance=User.objects.get(id=request.user.id)) 
    siteprofile_form = EditSiteProfile(request.POST, request.FILES, instance=SiteProfile.objects.get(user=request.user)) 
    if user_form.is_valid() and siteprofile_form.is_valid(): 
     user_form.save() 
     temp_siteprofile = siteprofile_form.save(commit=False) 
     temp_siteprofile.profile_image = process_image_string(request.FILES['profile_image'], (100, 100)) 
     temp_siteprofile.save() 
     return user_profile(request, request.user.username) 

機能:

def process_image_string(f, size): 
    f_image = Image.open(f) 
    f_image = f_image.resize(size) 
    output = StringIO() 
    f_image.save(output, "JPEG") 
    return output 

機能はこれが(私の目に)私の最も近かった、最後の3日間で、おそらく100回変更されていますのでご注意ください成功。

+0

あなたは上記のコードがスローするエラーを提供してくださいだろうか? – Paulo

+0

'cStringIO.StringO'オブジェクトに '_committed'属性がありません –

答えて

1

django-stdimageを試してみてください。それはImageFieldの延長であり、あなたのために画像のサイズを変更します、ここでは例の抜粋です:これにより

class MyClass(models.Model): 
    image1 = StdImageField(upload_to='path/to/img') # works as ImageField 
    image2 = StdImageField(upload_to='path/to/img', blank=True) # can be deleted through admin 
    image3 = StdImageField(upload_to='path/to/img', size=(640, 480)) # resizes image to maximum size to fit a 640x480 area 
    image4 = StdImageField(upload_to='path/to/img', size=(640, 480, True)) # resizes image to 640x480 croping if necessary 

    image_all = StdImageField(upload_to='path/to/img', blank=True, size=(640, 480), thumbnail_size=(100, 100, True)) # all previous features in one declaration 

、あなたが直接あなたのModelForm EditUserProfileを保存することができ、あなたは任意の画像操作を自分で行う必要はありません。欠点は、このライブラリがPILを特別に使用していることです。

Googleのコード:http://code.google.com/p/django-stdimage/

のGithub:https://github.com/humanfromearth/django-stdimage

+0

本当にあなたの答えに感謝します。私はこれを撃つだろう。しかし、私は本当にこの経験から学びたいので、私はより良くなることができます。 –

関連する問題