2012-01-06 116 views
3

我寫了一個簡單的Django應用程序測試的ImageField工作,但我遇到了問題upload_to只是似乎哪裏都不工作。下面是代碼:的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') 

在我的settings.py我:

[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開始蟒蛇殼結果,Django完全忽略了我的'upload_to'參數。我不知道爲什麼。從文檔中,我應該期待p.img.path返回「/home/jchin/workspace/testimage/static/images/test.jpg」,並在數據庫中存儲「images/test.jpg」,對嗎?但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。

請幫忙! 約翰

回答

8

upload_to是用於上傳,顧名思義。你沒有上傳,你直接分配圖片。只有當您創建FileField對象時(例如通過從表單上傳),才能使用upload_to。

+1

你可以給一些代碼snipet上如何完成上傳? – pinghsien422 2012-01-07 06:16:40

+0

我以爲上傳是在django之外進行的,好像我錯了。 – pinghsien422 2012-01-07 06:17:47

+0

更多此答案的示例代碼或鏈接將非常有用 – 2016-06-12 22:28:30

2

Daniel Roseman正確,upload_to僅在創建FileField對象時使用。

如果你正在做的,那麼傳統的方式的東西(在我的情況,有一個單獨的進程地方文件到一個目錄,僅僅告知它的存在的Django),使用.url財產上FileField/ImageField ,下面可能爲你工作:

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'