2012-01-06 21 views
3

ImageFieldをテストするための簡単なdjangoアプリケーションを作成しましたが、upload_toが動作しないような問題が発生しています。私が持っている私のsettings.pyでdjango imagefield upload_toはまったく動作しません

1 from django.db import models 
    2 
    3 # Create your models here. 
    4 class TestImage(models.Model): 
    5  img = models.ImageField(max_length=256, upload_to='images') 

:あなたから見ることができるように

[email protected]:~/workspace/testimage$ ./manage.py shell 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> import settings 
>>> from image_app.models import TestImage 
>>> p = TestImage(img='test.jpg') 
>>> p.save() 
>>> p.img.name 
'test.jpg' 
>>> p.img.path 
u'/home/jchin/workspace/testimage/static/test.jpg' 
>>> p.img.url 
'/media/test.jpg' 

:次に

2 from os.path import dirname, join, abspath 
    3 __dir__ = dirname(abspath(__file__)) 
50 MEDIA_ROOT = join(__dir__, 'static') 
55 MEDIA_URL = '/media/' 

私はmanage.pyを使用してPythonシェルを起動し、以下のコードであります結果、djangoは私の 'upload_to'パラメタを完全に無視しました。私はそれがなぜ分かりませんか。ドキュメントから私はp.img.pathが "/home/jchin/workspace/testimage/static/images/test.jpg"と "images/test.jpg"を格納しているDBを返すことを期待していますか?しかし、DBはファイル名だけを保存するだけです:

mysql> select * from image_app_testimage; 
+----+-----------+ 
| id | img  | 
+----+-----------+ 
| 1 | test.jpg | 
+----+-----------+ 
1 rows in set (0.00 sec) 

私はすべての文書をチェックして、私が間違っていることを見つけることができませんでした。誰でもアイデアはありますか?私はdjango 1.2.5を使用していて、upload_toをサポートする必要があります。

助けてください! John

答えて

8

ただし、upload_toは名前のとおりアップロードするためのものです。あなたはアップロードしていない、あなたはイメージを直接割り当てている。 FileFieldオブジェクトを作成する場合(フォームからアップロードするなど)には、upload_toが使用されます。

+1

アップロードの仕組みについていくつかのコードスニペットを付けることはできますか? – pinghsien422

+0

アップロードは私が間違っているように、外のジャンゴの世話を取ると思った。 – pinghsien422

+0

この回答のコードサンプルやリンクは非常に役に立つ.....役に立つ –

2

Daniel Rosemanが正しく、upload_toはFileFieldオブジェクトの作成時にのみ使用されます。

あなたはFileField/ImageField.urlプロパティを使用して、(私の場合には、ディレクトリの中に別のプロセスの場所のファイルを持って、単にそれの存在のジャンゴを知らせる)あまりの伝統的な方法で何かをやっている場合、以下はあなたのために働く可能性があります

import os 

from django.core.files.storage import FileSystemStorage 
from django.db import models 


class Video(models.Model): 
    video = models.FileField(
     upload_to=settings.VIDEO_MEDIA_URL, 
     storage=FileSystemStorage(
      location=settings.VIDEO_FILES_PATH, 
      base_url=os.path.join(settings.MEDIA_URL, settings.VIDEO_MEDIA_URL) 
     )) 

settings.pyで:

MEDIA_URL = '/media/' 
VIDEO_MEDIA_URL = 'videos/' # Note: Trailing slash required. 

さて、urlプロパティは、適切なパスを返す必要があります:

>>> from test_app.models import Video 
>>> p = Video(video='test.mp4') 
>>> p.save() 
>>> p.video.name 
'test.mp4' 
>>> p.video.path 
u'/home/alukach/Projects/test/media_dir/videos/test.mp4' 
>>> p.video.url 
'/media/videos/test.mp4' 
関連する問題