【问题标题】:How to save a user’s image and display it如何保存用户的图像并显示它
【发布时间】:2020-05-28 11:13:25
【问题描述】:

我有一个用户配置文件模型。

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(User,default='default.jpg', upload_to='profile_pics',) #default avatar user /download avatar user 
    avatar = models.CharField(max_length=300, null=True, blank=True) #field for storing url from a social network

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

它有两个图像字段。

1-常规默认头像(输入图片),用户可以自行设置,下载后保存在media/profile_pics文件夹中。

2 字段(输入 头像) - 存储来自外部(社交网络)的头像 url。我还有两个授权,常规和社交 (python-social-auth)。通过社交网络授权通话时,我使用函数获取用户地址的url:

def get_avatar(backend, response, user=None, *args, **kwargs):

    if backend.name == 'vk-oauth2': 
        url = response.get('photo', )   
    if url:
        user.profile.avatar = url
        user.profile.save()

我得到了一个这样的链接(url变量):

https://sun9-12.userapi.com/c852132/v852132234/118b6c/aB0GoDEWzaw.jpg

并保存此网址user.profile.avatar

在模板中,我输出:

<img  src="{{user.profile.image.url }}"> - #default avatar user/download avatar user
<img  src="{{user.profile.avatar}}"> - #social avatar (url) user

如何确保在通过社交授权进行授权时,下载来自 url 的图像并将其保存在与 imagefield (profile.image) 一样的文件夹中?也就是在通过社交网络进行atvorization时,图片是通过url下载的,并保存为该字段为图像,我可以通过用户访问它。 profile.image.url,而不是单独的 user.profile.avatar 字段?

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您可以通过urllib.request下载图片:

    import urllib.request
    import mimetypes
    
        def save_image(user):
            url = user.profile.avatar
            filename = user.id + mimettypes.guess_extension(urllib.request.urlopen(url).headers['content-type'])
            path = os.path.join(settings.MEDIA_ROOT, filename)
    
            urllib.request.urlretrieve(url, path)
    
            user.image = path
            user.save()
    

    根据您的存储位置,您可能会更改路径,但这应该是可能的解决方案的草图。

    编辑:当您使用 ImageField 时,这也应该有效:

    import urllib.request
    
        def save_image(user):
            url = user.profile.avatar
            file = urllib.request.urlopen(url).read()
    
            user.image = file
            user.save()
    

    【讨论】:

    • 非常感谢您的回答,我一测试就在这里退订
    • 我怎样才能在模板中显示这个?
    • 以及如何获取图片保存的路径?
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2021-06-12
    • 1970-01-01
    • 2015-08-30
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多