关于django-avatar的一个小BUG

django-avatar是一个为用户提供头像功能的django第三方插件,github地址:https://github.com/jezdez/django-avatar


其中在admin页面显示用户的头像的时候有点错误,就是说再admin页面上总是显示该用户当前的头像,而不显示该该用户所有的头像。但是在模板上显示用户的

每一个头像的时候又很正常。

比如,在admin页面有,




产生该BUG的原因是在admin.py中,显示头像的方法:get_avatar中,返回有问题:源码中是这样的:


    def get_avatar(self, avatar_in):
        return avatar(avatar_in.user, 80)

这必须是不行的呀。

首先,在admin中,我们要显示的属性有:

list_display = ('get_avatar', 'user', 'primary', "date_uploaded")

也就是说第一列显示的是get_avatar这个函数返回的东西,这个函数名是随意的,仅仅是为了绑定而已。而该函数是上面定义的,而我们的admin是很model想关联的,所以,可以预见,该函数的avatar_in参数是一个Avatar对象,并且是queryset中的每一条记录,当然,这个参数名随便,django总是将对象传给该函数,作为第一个参数。

所以嘛,该函数的返回值我们就知道了:

总是返回当前User的头像,当前User的图像不管有多少个,当前头像总是其primary属性为True的头像,所以嘛,该返回方法并不能返回用户的具有的每一个头像。在改变User头像的页面却可以显示该用户的每一个头像,则我们可以借鉴其中的方法。

avatar这个标签中,有

@cache_result()
@register.simple_tag
def avatar(user, size=settings.AVATAR_DEFAULT_SIZE, **kwargs):
    if not isinstance(user, get_user_model()):
        try:
            user = get_user(user)
            alt = six.text_type(user)
            url = avatar_url(user, size)
        except get_user_model().DoesNotExist:
            url = get_default_avatar_url()
            alt = _("Default Avatar")
    else:
        alt = six.text_type(user)
        url = avatar_url(user, size)
    context = dict(kwargs, **{
        'user': user,
        'url': url,
        'alt': alt,
        'size': size,
    })
    return render_to_string('avatar/avatar_tag.html', context)


这里返回的是这么一个html页面(字符串形式)

<img src="{{ url }}" alt="{{ alt }}" width="{{ size }}" height="{{ size }}" />



则,我们可以模仿这个来改一下admin.py:

    def get_avatar(self, avatar_in):
    	context = dict({
        	'user': avatar_in.user,
        	'url': avatar_in.avatar.url,
        	'alt': six.text_type(user),
        	'size': 80,#这个随意了,默认都是80
    	})
  return render_to_string('avatar/avatar_tag.html', context)

修改后:




这样就可以了~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值