ImageField:仅保存文件名

时间:2012-01-14 15:31:15

标签: django django-models

我的模型有ImageFile字段:

def upload_course_cover(object, filename):
    return '/media/courses/%s_%s' % (Course.objects.aggregate(Max('id'))['id__max'] + 1, filename)

class Course(models.Model):
    # ...
    cover = models.ImageField(upload_to=upload_course_cover,  blank=True)

保存图片后,cover字段将写入完整图片路径/media/courses/id_filename.ext,但我希望仅存储图片名称id_filename.ext。 怎么做?

2 个答案:

答案 0 :(得分:3)

您无法更改它在数据库中存储的内容 - 除非您创建自己的自定义字段;或使用CharField

如果您只想显示文件名:

import os
c = Course.objects.get(pk=1)
fname = os.path.basename(c.cover.name)

# if cover's name is /hello/foo/bar.html
# fname will be bar.html

但是,由于您有图像字段 - 例如,您可以从中获得许多好处 - 获取URL以img标记显示图像:

<img src="{{ c.cover.url }}" alt="cover image for {{ c.name }}" />

您还可以获得其他一些好处,例如:

class Course(models.Model):
    # ....
    cover_height = models.IntegerField()
    cover_width = models.IntegerField()

    cover = models.ImageField(upload_to=upload_course_cover,
                              height_field=cover_height,
                              width_field=cover_width,
                              # your other options...
                              )

现在你可以做到:

<img src="{{ c.cover.url }}" height="{{ c.cover_height }}" width="{{ c.cover_width }}">

答案 1 :(得分:0)

“保存图像后,进入封面字段将写入完整的图像路径/media/courses/id_filename.ext”

确切地说,事实并非如此。只有MEDIA_ROOT的相对路径才会保存在数据库中。见https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to

(ImageField与FileField具有相同的属性)

要仅保存文件名,您可以

  1. 添加新的CharField以存储名称
  2. 使用os.split()在调用时只获取文件名