4

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に帰属させるか、template.htmlで何かを実行することで、ユーザーがアバター画像をロードしていないときにデータベースにアクセスすることを排除する方法はありますか?ありがとうございました!

4

1 に答える 1

6

あなたの質問を与えられた適切なユーザー名!

すべてのテンプレートにデフォルトのアバターを提供するコンテキスト プロセッサを作成し、コンテキスト プロセッサが画像をキャッシュするようにするだけです。

設定.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')  

しかし最後に、デフォルトのアバターをデータベースに保持することをまったく避け、代わりに上記のようなコンテキスト プロセッサを記述し、DB からデフォルトのアバターを取得する代わりに、画像への静的な 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 に答える