【问题标题】:Customize ImageField url/path自定义 ImageField url/路径
【发布时间】:2013-12-24 09:58:59
【问题描述】:

我有一个基本上描述 HTML 页面的页面模型。然后使用 URL 为页面提供服务,例如 http://www.mysite.com/page/1234/ 用于 id (pk) 1234 的页面。

我希望能够将图像添加或附加到我的页面。因此,我想使用带有 Page 对象外键的 Image 类:

class Page(models.Model):
    title = ...
    content = ...

class Image(models.Model):
    page = models.ForeignKey(Page)
    image = models.ImageField(...)

这是我的问题:我想使用以下形式的 url 将图像传递给客户端: http://www.mysite.com/images/1234/image_name.jpg,即包含页面 ID 的 URL。同样在服务器上,路径应该反映页面结构:/path/to/media/images/1234/image_name.jpg

我不知道如何解决这个问题。一方面,我想保留与路径格式相关的 ImageField 功能。比如上传两张同名图片时,Django会创建两条以“image.jpg”和“image_2.jpg”结尾的路径来区分两张图片。

另一方面,upload_to 选项的功能有限,我不知道如何在路径中插入页面 id。特别是一些棘手的情况,比如在创建页面的同时上传图片(使用相同的表单),这意味着在上传图片之前应该生成页面id。

制作一个具有上述行为的图像模型是否相当容易?如果是这样,我必须如何修改 Image 模型以在图像路径中插入页面 id?

看过Customize save path for ImageField的问题,但是没有解决主键可能没有赋值的问题。

谢谢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    其实一个简单的函数作为upload_to参数传递就可以了,不存在id不存在的问题。所以我猜Django的默认行为是在保存父页面模型后保存图像,如我所愿。

    在图像模型中:

    image = models.ImageField(upload_to=get_image_path)
    

    具有以下功能:

    def get_image_path(instance, filename):
        return 'pics/' + str(instance.page.id) + '/' + filename
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 2017-11-13
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      相关资源
      最近更新 更多