Связывание @username в шаблонных переменных Django - PullRequest
1 голос
/ 29 марта 2011

Я использую Twitter API и показываю список твитов.Я хотел бы связать имена пользователей и хэштеги в моем приложении с подходящим местом, но все, что у меня есть, - это строка с символами @ и # в них.«если переменная содержит слово, начинающееся с #, окружите его символом?» *

Или я должен использовать Javascript для этого?

1 Ответ

5 голосов
/ 29 марта 2011

Я не уверен насчет обработки внутри самого шаблона без создания собственного фильтра, но вы можете обработать его в контроллере с помощью python?В базовой форме с регулярным выражением:

import re

user_pattern = re.compile('(\s|^)(@)(\w+)(\s|$)')
tweet = 'Hey @pssdbt, thats not what I wanted!'
tweet = user_pattern.sub('\1<a href="http://www.twitter.com/\3">\2\3</a>\4', tweet)

Что должно привести к:

'hey <a href="http://www.twitter.com/pssdbt">@pssdbt</a>, thats not what i wanted!'

Тот же метод применим и к хэштегам.Хотя я не думаю, что в javascript было бы слишком сложно позаботиться об этом.

Обновление / Как пользовательский фильтр:

Согласно http://docs.djangoproject.com/en/dev/howto/custom-template-tags/ вы просто создадите файл с именем что-то вроде your_app / templatetags / twittify.py

В этом файле добавьте:

from django import template
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
import re

register = template.Library()

@register.filter(name='twittify')
def twittify(tweet, autoescape=None):
    tweet = conditional_escape(tweet)
    user_pattern = re.compile('(\s|^)(@)(\w+)(\s|$)')
    tweet = user_pattern.sub('\1<a href="http://www.twitter.com/\3">\2\3</a>\4', tweet)
    return mark_safe(tweet)

twittify.needs_autoescape = True

Тогда в ваших шаблонах вы сможетеиспользуйте что-то вроде этого (если предположить, что это выглядит примерно так):

<ul id="tweets">
    {% for tweet in tweets %}
        <li>{{ tweet | twittify }}</li>
    {% endfor%}
</ul>

Я никогда не играл с пользовательскими фильтрами раньше, но, надеюсь, это, по крайней мере, направит вас в правильном направлении.

...