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

3
在我的网站上,用户可以上传自己的个人资料照片。我通过在扩展了核心用户模型的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个人资料图片的最佳方法?如果我将Facebook个人资料图片的路径存储在“profile_picture”字段中,则必须在网站上显示每个个人资料图片之前进行检查,否则我会得到我的MEDIA_ROOT/MEDIA_URL预先添加到该图片的结果:
/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 }}

然而,这两种选择都感觉像是hack的方式,我感觉一定有更有效率的方法来做到这一点。因此,我求助于SO,希望能够在这里获得一些启示和指导,了解最佳实践。
提前感谢您的帮助。
1个回答

2
几种可能性:
  1. 在写入时,重写 save() 方法,在将值写入数据库之前将其转换为所需的值。
  2. 在读取时,创建一个方法来检查存储的值并将其转换为适当的模式。应用 @property 装饰器,这样您可以直接从模板中访问它。
我想补充说明,在我的类似情况中(相同但不同),我完全放弃了 ImageField,改用 CharField,并让上述例程处理唯一的图像细节(例如:缩略图)。

+1 谢谢,最终选择了类似选项1的方案。 - rolling stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接