2012-01-06 31 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'