在我的网站上,用户可以上传他们自己的个人资料图片,我通过扩展核心用户模型的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来获得关于最佳实践的一些灵感/指导。
提前感谢您的帮助。
答案 0 :(得分:1)
有几种可能性:
save()
并在写入数据库之前将给定值按下到所需的值,或者@property
装饰器,以便您可以直接从模板我可能会在我自己的战斗中沿着这些线(相同但不同)添加它,我完全放弃了ImageField以支持CharField,让上面的例程处理独特的成像细节(例如:缩略图)。