django imagefield upload_to 根本不起作用

问题描述 投票:0回答:4

我编写了一个简单的 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”并在数据库中存储“images/test.jpg”,对吗?但数据库只存储文件名:

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

我检查了所有文档,但找不到我做错了什么。有人有主意吗?我正在使用 django 1.2.5,它应该支持 upload_to。

请帮忙! 约翰

django upload imagefield
4个回答
11
投票

但是

upload_to
顾名思义是用于上传的。您不是上传,而是直接分配图像。仅当您创建
FileField
对象(例如通过从表单上传)时,才会使用
upload_to


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'

0
投票

仅供参考,在 HTML 模板中的表单声明中包含 enctype="multipart/form-data" 部分非常重要,否则 FileField/ImageField 可能无法正常工作。


0
投票

这对我有用...

模型.py

img = models.ImageField(upload_to='static/images', default='', blank=True)

管理员.py

class TestImage(admin.ModelAdmin):
    fieldsets = [['Some text', {'fields': ['img']}],]

现在您可以上传您的图片了。

© www.soinside.com 2019 - 2024. All rights reserved.