Я чувствую, что вы выполняете слишком много работы только для кнопки «Мне нравится», и я ненавижу javascript, поэтому стараюсь избегать его настолько, насколько это возможно, особенно при загрузке документов, поскольку это отстает от браузера пользователя.Я собираюсь опубликовать то, что я использую для «подписок», и, надеюсь, это каким-то образом поможет вам.
В контроллере у меня есть шаблон, который создает кнопку подписки.Вместо того, чтобы менять имена на одной кнопке, я делаю две кнопки со скрытой (или отключенной).Это действительно не должно занимать намного больше времени, чем то, что вы делаете в настоящее время.Используя Mako (не знакомый с Chameleon), функция шаблона:
<%def name="subscribe(post)">
% if request.user:
<% subscribe = Bookmark_C.check_subscribed(request.user.id, post.id) %>
<span class="pstnm">${Bookmark_C.get_num_subscribers(post.id)}</span>
<span class="pstbtn${' hide' if subscribe else ''}" id="sub_${post.base36}" onclick="subscribe(this)">subscribe</span>
<span class="pstbtn${' hide' if not subscribe else ''}" id="unsub_${post.base36}" onclick="unsubscribe(this)">unsubscribe</span>
% endif
</%def>
Текущий пользовательский объект хранится в request.user, и подписка является логическим значением, сообщающим, подписан ли текущий пользователь на текущего"сообщение".Я идентифицирую каждую кнопку с помощью названия кнопки «sub» или «unsub», добавляя после него идентификатор сообщения, которое я отправляю / получаю в форме base36, и разделяю эти два имени подчеркиванием.Затем я использую JavaScript для извлечения идентификатора поста из идентификатора каждой кнопки.
function subscribe(obj) {
var id = $(obj).attr("id").split('_')[1];
$.post(
"/api/subscribe/",
{id: id, _csrf: _csrf},
function () {
$('#sub_' + id).hide();
$('#unsub_' + id).show();
}
);
}
У меня в принципе та же функция для отписки.Обратите внимание, как я получаю идентификатор сообщения из атрибута идентификатора кнопки./ Api / subscribe / и / api / unsubscribe / route принимает только один параметр, id, и заставляет request.user подписываться на пост с этим идентификатором.Эти маршруты не будут работать, если request.user или _csrf не существует.
Моя версия намного короче и работает точно.Надеюсь, это поможет вам.
Для лайков против следующих я написал бы два шаблона и два набора функций javascript, предполагая, что они используют совершенно разные контроллеры.Если вы пытаетесь скопировать Facebook, где «Like», «Subscribe» и «Follow» - это одно и то же, то все, что вам нужно сделать, - это разрешить шаблону различный текст:
<%def name="subscribe(post, subtitle='subscribe', unsubtitle='unsubscribe')">
...
<span ...>${subtitle}</span>
<span ...>${unsubtitle}</span>
</%def>