自定义ImageField网址/路径

时间:2013-12-06 21:54:01

标签: django django-models

我有一个基本描述HTML页面的Page模型。然后,网页会提供网址,例如http://www.mysite.com/page/1234/,用于ID(pk)1234的页面。

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

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

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

这是我的问题:我想使用以下形式的网址向客户端提供图片: 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。

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

我已经看到问题Customize save path for ImageField,但它没有解决可能未分配的主键问题。

感谢。

1 个答案:

答案 0 :(得分:0)

实际上,作为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