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)
修改后: