4

我正在使用django-imagekit来调整我的用户头像,现在显示默认头像(如果用户没有上传他/她的头像)我这样做:

视图.py

    try:
        usr_avatar = UsrAvatar.objects.get(user=request.user.id)        
    except UsrAvatar.DoesNotExist: 
        usr_avatar = UsrAvatar.objects.get(id='0')  

模板.html

<img src="{{ usr_avatar.avatar_image.url }}" >

这很好用,但是每次用户没有上传他/她的头像时,我都会访问数据库以获取默认头像图像。

当用户没有加载头像图像时,有没有办法通过将默认图像链接归因于usr_avatar或只是在 template.html 中执行某些操作来消除对数据库的访问?谢谢!

4

1 回答 1

6

给出您的问题的 Apt 用户名!

您可以创建一个上下文处理器,为每个模板提供默认头像,并确保上下文处理器缓存图像

设置.py

TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.default_avatar',
...
)

myapp/context_processors.py

from django.core.cache import cache 
def default_avatar(request):
    default_avatar = cache.get('default_avatar', False)
    if not default_avatar:
        default_avatar = UsrAvatar.object.get(id='0')
    return {
        'default_avatar' : default_avatar
    }

现在模板变量“default_avatar”在每个模板中都可用:

{% if usr_avatar %}
    {{ usr_avatar }}
{% else %}
    {{ default_avatar }}
{% endif %}

或者,只需在原始查询中使用缓存:

try:
    usr_avatar = UsrAvatar.objects.get(user=request.user.id)        
except UsrAvatar.DoesNotExist: 
    usr_avatar = cache.get('default_avatar', False)
    if not usr_avatar:
        usr_avatar = UsrAvatar.objects.get(id='0')  

但最后,最好完全避免将默认头像保留在数据库中,而只需编写一个像上面这样的上下文处理器,而不是从数据库中获取默认头像,只需要有一个图片的静态 url

from django.conf import settings
def default_avatar(request):
    return {
        'default_avatar' : '%simages/default_avatar.jpg' % settings.STATIC_URL
    }
于 2011-11-05T14:36:59.250 回答