3

我编写了一个简单的 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。

请帮忙!约翰

4

4 回答 4

10

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

于 2012-01-06T19:06:23.567 回答
2

Daniel Roseman 是正确的,upload_to仅在创建 FileField 对象时使用。

如果您以不太传统的方式做某事(在我的情况下,有一个单独的进程将文件放入目录并简单地通知 Django 它的存在),要使用/.url上的属性,以下可能对您有用:FileFieldImageField

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'
于 2014-10-08T17:29:12.257 回答
0

FYI, it's important to have enctype="multipart/form-data" part of the form declaration in the HTML template, otherwise the FileField/ImageField might not work appropriately.

于 2018-08-31T06:47:40.703 回答
0

这对我有用...

模型.py

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

管理员.py

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

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

于 2019-01-14T07:07:52.537 回答