我的模型有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
。
怎么做?
答案 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具有相同的属性)
要仅保存文件名,您可以