Разделение ответственности между представлением и шаблоном в Django - PullRequest
2 голосов
/ 14 июня 2011

В Твиттере есть функция, называемая хэштегами, которая извлекает теги из сообщений.
Например, в

"Hey #guys, I love #stackoverflow"

#guys и #stackoverflow кликабельны и ведут к собственным запросам.

Я создаю подобное приложение для обучения, и мне интересно , где и когда на самом деле вставлять ссылки в вывод ?

Я беру все последние твиты:

def index(request):
    latest_tweets = Tweet.objects.all().order_by('-pub_date')[:5]
    return render_to_response('index.html',
                              { 'tweets': latest_tweets },
                              context_instance=RequestContext(request)
                              )

И в блоке я рендер:

{% for tweet in tweets %}
    <p>{{tweet.message}}</p>
{% endfor %}

Но это, конечно, показывает только обычное сообщение, без ссылок.
Я хочу, чтобы каждый #tag в message был заменен ссылкой, передающей имя тега в строке запроса в представление с именем by_tag.

Принадлежит ли <a href="..."> s к views.py? Тогда что, если позже я решу, что это AJAX-ссылка? Хорошо, похоже, это относится к шаблонам. Но как мне сделать такую ​​сложную замену с маршрутизацией из шаблона? Должен ли я написать собственный фильтр шаблона?

Просто для справки, Tweet содержит свои Tag s в поле с именем tags.

1 Ответ

4 голосов
/ 14 июня 2011

На прошлой неделе я сделал нечто подобное и написал быстрый пользовательский шаблонный шаблон , чтобы сканировать текст в поисках упоминаний и хэштегов и оборачивать их в ссылки.

https://gist.github.com/1023144

Имеет смысл сделать это на уровне шаблона, когда вы выполняете разметку / замену HTML.

Как правило, ваши представления выполняют логику маршрутизации, то есть принимают URL, извлекают и объединяют необходимые данные и отображают шаблон.

Если есть какая-либо связанная логика, которую вам нужно выполнить в модели (например, сравнить с твитами, например), было бы неплохо поместить это в функции модели или в менеджеры моделей, поскольку это логика, привязанная к моделям и База данных.

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

Иногда, однако, вы можете захотеть выполнить некоторую логику на уровне шаблона, чтобы ее можно было повторно использовать в разных представлениях (например, например, для получения 10 самых популярных тегов). Это хорошее время для создания тега шаблона для выполнения логики (и это также хорошо и многократно используется)

В любом случае, поместите этот код в:

yourapp/templatetags.py

и в шаблоне:

{% for tweet in tweets %}
    <p>{{ tweet.message|twittify }}</p>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...