Использование граватар в Джанго - PullRequest
6 голосов
/ 02 ноября 2010

Я хочу использовать Граватары в моем приложении Django. В приложении cw я создал каталог templatetags со следующей архитектурой:

cw/
    templatetags/
         __init.py__
         gravatar.py
    views.py
    ...

gravatar.py содержит

from django import template
import urllib, hashlib

register = template.Library()

class GravatarUrlNode(template.Node):
def __init__(self, email):
    self.email = template.Variable(email)

def render(self, context):
    try:
        email = self.email.resolve(context)
    except template.VariableDoesNotExist:
        return ''

    default = "/site_media/img/defaultavatar.jpg"
    size = 40

    gravatar_url = "http://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() + "?"
    gravatar_url += urllib.urlencode({'d':default, 's':str(size)})

    return gravatar_url

@register.tag
def gravatar_url(parser, token):
    try:
        tag_name, email = token.split_contents()

    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]

    return GravatarUrlNode(email)

и в одном из шаблонов cw я попробовал:

{% load gravatar %}

но я получаю:

'gravatar' is not a valid tag library: Template library gravatar not found, tried django.templatetags.gravatar,django.contrib.admin.templatetags.gravatar`

Я запускаю Django 1.2.1 Python 2.6 и в моем settings.py:

TEMPLATE_LOADERS = ( 
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
'django.template.loaders.eggs.load_template_source',
)
TEMPLATE_CONTEXT_PROCESSORS = ( 
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.auth",
"django.core.context_processors.request",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.contrib.messages.context_processors.messages",
)

РЕДАКТИРОВАТЬ: я нашел эту другую реализацию, которая аккуратнее: http://tomatohater.com/2008/08/16/implementing-gravatar-django/

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

Ваша проблема здесь:

cw/
    templatetags/
        __init.py__ <<<
        gravatar.py
    views.py
    ...

Это должно быть __init__.py, а не __init.py__

2 голосов
/ 03 ноября 2010

Итак, решение, которое я нашел, состоит в том, чтобы делиться шаблонами gravatar среди всех моих приложений , создав каталог lib:

proj/
    __init__.py
    lib/
        __init__.py
        templatetags/
            __init.py__
            common_tags.py

и добавление lib в мои установленные приложения

...