2014-02-12 107 views
1

我试图跟踪所有用户的用户头像。我已将一个imageField添加到我的用户模型中。我也有Facebook登录,如果用户使用Facebook登录,我很高兴只是使用他们的个人资料图片作为头像,并让Facebook主持这一点,但我也希望不登录Facebook的用户上传头像。问题是,当我尝试直接保存到的ImageField这样的:Django将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字段和一个头像字段?

回答

0

如果你想保存图像,不需要有两个字段(因为你使用url来获取图像,并且没有必要保存url)。如果您想了解如何操作,可以使用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) 

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

+0

我不想保存图像。我想使用他们的Facebook图片的网址。但是,如果他们没有登录Facebook,我希望他们能够上传头像。但我希望将该链接保存在一个地方,无论是将其上载到媒体目录的图像引用,还是将其托管在Facebook上。 –

+0

那么,当你上传一个文件时,它会被保存在某个地方,而你所关注的是一个指向该图像的链接。因此,从技术上讲,您*只能使用一个字段,但您必须添加自己的验证,最简单的方法可能是覆盖'save'方法 – yuvi

+0

请参阅我的回答以获得建议的解决方案。仅仅因为你希望他们能够上传图片,并不需要你有一个ImageField – yuvi