Django将imageField链接到外部URL

时间:2014-02-12 16:13:52

标签: django django-models

我正在尝试跟踪所有用户的用户头像。我已将imageField添加到我的用户模型中。我也有facebook登录,如果用户使用facebook登录,我很高兴只使用他们的个人资料图片作为头像并让facebook主持这个,但我也希望不登录facebook的用户上传头像。问题是当我尝试直接保存到ImageField时:

模型:

avatar = models.ImageField(upload_to='avatars/%Y/%m/%d', default="", blank=True)

在视图中:

info.avatar = 'http://graph.facebook.com/555555/picture/' 

然后它保存相对于媒体网址的网址,所以当我尝试加载它时,我得到了这个为avatar.url:

http://domain.com/media/https%3A//graph.facebook.com/555555/picture/

这显然不是我想要的。有没有办法将它们保存在同一个字段中,或者我被迫创建两个单独的字段,profile_pic_url字段和头像字段?

1 个答案:

答案 0 :(得分:0)

如果要保存图像,则不需要有两个字段(因为您使用网址来获取图像,也不需要保存网址)。如果您想了解如何操作,可以使用django-social-auththis answer作为参考。

但是,等一下 - 这真的是你想要的吗?想想看,如果用户更改了他的个人资料图片怎么办?你也不会改变你网站上的图像吗?在这种情况下,使用用户的个人资料图片的通用路径,如果我没有记错,通常会http://graph.facebook.com/<user_id>/picture

修改

一个好主意就是这样做:

class Info(models.Model):
    #... all the fields
    image = models.URLField() #or a charField. That's what this is, basically

    def save(self, *args, **kwargs):
        if (connected with facebook):
            self.image = 'http://graph.facebook.com/555555/picture/'
        else:
            self.image = 'http://domain.com/media/avatars/someimage.jpg'

        super(Info, self).save(*args, **kwargs)

现在,您的模型只有一个字段,您可以自定义模型以包含不需要的文件字段。这对你有意义吗?