我已经编写了一个简单的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中,我有:
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 shell:
jchin@ubuntu:~/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'
从结果中可以看出,django完全忽略了我的'upload_to'参数。我无法弄清楚为什么。从文档中我应该期望p.img.path返回“/home/jchin/workspace/testimage/static/images/test.jpg”并在DB中存储“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。
请帮忙! 约翰
答案 0 :(得分:8)
但upload_to
用于上传,顾名思义。您没有上传,而是直接分配图片。只有在您创建FileField
对象时(例如,从表单上传)才会使用upload_to。
答案 1 :(得分: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'
答案 2 :(得分:0)
仅供参考,在HTML模板中的表单声明中使用enctype =“ multipart / form-data”部分非常重要,否则FileField / ImageField可能无法正常工作。
答案 3 :(得分:0)
这对我有用...
Models.py
img = models.ImageField(upload_to='static/images', default='', blank=True)
Admin.py
class TestImage(admin.ModelAdmin):
fieldsets = [['Some text', {'fields': ['img']}],]
Boom,您可以上传图片。