django-imagekit - лучший способ показать изображение по умолчанию? - PullRequest
4 голосов
/ 05 ноября 2011

Я использую django-imagekit , чтобы изменить размеры аватаров пользователя и сейчас отображать аватар по умолчанию (если пользователь не загружал свой аватар). Я делаю это:

views.py

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

template.html

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

Это отлично работает, но каждый раз, когда пользователь не загружалего / ее аватар Я попадаю в базу данных для изображения аватара по умолчанию.

Есть ли способ устранить попадание в базу данных, когда у пользователя нет загруженного изображения аватара, если каким-либо образом присвоить ссылку на изображение по умолчанию на usr_avatar или просто сделать что-то в файле template.html?Спасибо!

1 Ответ

6 голосов
/ 05 ноября 2011

Apt имя пользователя с учетом вашего вопроса!

Вы можете создать процессор контекста , который обеспечивает аватар по умолчанию для каждого шаблона и просто убедиться, что процессор контекста кэширует изображение

settings.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
    }
...