Django:在ImageField中存储相对和绝对图像路径

时间:2011-09-14 02:29:36

标签: django django-models django-templates

在我的网站上,用户可以上传他们自己的个人资料图片,我通过扩展核心用户模型的UserProfile模型中的ImageField进行管理。这是UserProfile模型的简化版本:

class UserProfile(models.Model):
    picture = models.ImageField(upload_to='img', blank=True, null=True)
    profile_picture = models.ImageField(upload_to='img', default='img/profile/default_profile.png', blank=True, null=True)
    user = models.ForeignKey(User, unique=True)

我正在使用PIL创建上传图片的缩略图版本。

要在我的模板中显示个人资料图片,我正在使用文档中推荐的url功能,如下所示:

{{ user.get_profile.profile_picture.url }}

我正在处理的问题是当用户将他们的帐户连接到Facebook时,并希望将他们的Facebook个人资料图片用作我的网站上的个人资料图片。

根据用户指定的设置,处理用户上传的图片或Facebook个人资料图片的最佳方式是什么?

如果我将路径存储到profile_picture字段中的Facebook个人资料图片,我会被迫在网站上显示每个个人资料图片之前进行检查,否则我会获得我的MEDIA_ROOT / MEDIA_URL -prended到图像:

/media/https://graph.facebook.com/[fbid]/picture

我的另一个选择是在上传图像时将MEDIA_ROOT / MEDIA_URL添加到profile_picture字段。不幸的是,执行此操作的唯一方法是在我的views.py中的add_profile_picture函数中,因为Django默认存储到图像的路径而没有开始的正斜杠,并且因为如果您尝试打开一个图像,PIL会变得更加强大相对路径以正斜杠开头。但是,如果我预先挂起完整的图像路径,我不必在模板中使用url功能,我可以按如下方式显示图像,无论是上传的图像还是Facebook形象:

{{ user.get_profile.profile_picture }}

然而,这两个选项都像黑客一样,我觉得必须有一个更有效的方法来做到这一点,所以我转向SO来获得关于最佳实践的一些灵感/指导。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

有几种可能性:

  1. on write,覆盖save()并在写入数据库之前将给定值按下到所需的值,或者
  2. 在阅读时,创建一种方法,检查存储的值并将其按摩到适当的模式。应用@property装饰器,以便您可以直接从模板
  3. 访问它

    我可能会在我自己的战斗中沿着这些线(相同但不同)添加它,我完全放弃了ImageField以支持CharField,让上面的例程处理独特的成像细节(例如:缩略图)。