#django #jquery #django-templates #django-views
#django #jquery #django-шаблоны #django-просмотры
Вопрос:
Я хочу реализовать кнопку ajax «нравится», которая должна увеличить количество лайков, а не обновлять всю страницу. Я новичок в ajax, поэтому, пожалуйста, помогите.
urls.py:
(r'^like/(d )/$',like),
Ниже приведен мой код просмотра для like:
def like(request,feedno):
feed=Feed.objects.get(pk=feedno)
t=request.META['REMOTE_ADDR']
feed.add_vote(t, 1)
vote, created = Vote.objects.get_or_create(
feed=feed,
ip=t,
)
feed.likecount =1
feed.save()
if 'HTTP_REFERER' in request.META:
return HttpResponseRedirect(request.META['HTTP_REFERER'])
return HttpResponseRedirect('/')
Ниже мой html (например, div):
<div class="like_abuse_box">
<p>Likes:<b>{{vote.feed_set.count}}</b> ||
<a class="like" href="/like/{{feed.id}}/">Like</a> |
<a class="abuse" href="/abuse/{{feed.id}}/">Abuse</a> || </p>
</div>
Какой код я должен включить, чтобы обновлять только этот конкретный div и отображалось обновленное количество лайков без перезагрузки всей страницы. Нужна помощь. Спасибо.
Ответ №1:
Не тестировал, хотя что-то подобное должно сработать. Редактировать: протестировано и работает, теперь для нескольких элементов на веб-странице
Javascript
$("a.like").click(function(){
var curr_elem = $(this) ;
$.get($(this).attr('href'), function(data){
var my_div = $(curr_elem).parent().find("b");
my_div.text(my_div.text()*1 1);
});
return false; // prevent loading URL from href
});
Представление Django
Вы можете добавить, является ли запрос Ajax с:
if request.is_ajax():
Комментарии:
1. Кажется, это работает. Она не обновляет всю страницу, но вводит некоторые nos, например, если голос равен 0, и я нажимаю, чтобы он заменил 0 на ‘11364’ во всех местах подсчета лайков. итак, все каналы получают это значение like (11364) и только после обновления они возвращаются к нормальному количеству лайков. почему это так? нужна помощь.
2. Вы уверены? Я отредактировал ее один раз, поскольку не было * 1 для преобразования текста в int. Она принимает число из <b>{{vote.feed_set.count}}</b> и увеличивает его на единицу после завершения запроса ajax.
3. на самом деле у меня есть like_abuse_box внутри каналов для цикла. итак, таких полей много. Итак, когда мне нравятся все остальные поля, голоса тоже меняются. и все они меняются на 6-значный номер, как указано ранее. проблема все еще сохраняется. Есть идеи, почему это так ..? Спасибо.
4. @berni Я пытался использовать написанный вами javascript, но у меня возникла проблема в том смысле, что javascript не работает. Когда я нажимаю кнопку, это простая операция, а не действие, выполняемое javascript. Я сделал именно так, как написано выше. Не могли бы вы помочь мне с этим
Ответ №2:
Первое: укажите идентификатор html-элемента, в который нужно ввести содержимое.
<div class="like_abuse_box">
<p>Likes:<b id="like_count">{{vote.feed_set.count}}</b> ||
<a class="like" href="/like/{{feed.id}}/">Like</a> |
<a class="abuse" href="/abuse/{{feed.id}}/">Abuse</a> || </p>
</div>
во-вторых, по вашему мнению, вам нужно вернуть последнее количество лайков. Вы не можете просто локально обновить количество, поскольку есть вероятность, что кто-то другой также обновил количество «нравится».
Наконец. на вашей странице включите jquery
$("a.like").bind("click", function(){
var link = $(this).attr("href");
$.get(link, function(data) {
$(this).parent("div").children('b#like_count').html(data);
});
});
Я не совсем уверен в родительском дочернем селекторе, чтобы перейти от гиперссылки, на которую нажата ссылка, к соответствующему количеству лайков. Возможно, вам придется поиграть с jQuery selector, чтобы сделать это правильно.
Кроме того, если вы используете POST для своего просмотра, замените $.get на $.post