Вы близки, однако, как указал @MartijnPieters, вам все равно нужно связаться с бэкэндом, чтобы обновить количество лайков для поста. Для этого слегка измените свой HTML-код, чтобы включить кнопку для обновления лайков с помощью класса и идентификатора. Идентификатор будет таким же, как и идентификатор записи, и класс будет общим. Затем используйте jquery
с ajax
после создания script
.
Сначала в бэкэнде Python создайте маршрут для обработки обновления лайков:
@app.route('/update_like')
def update_likes():
_id = int(flask.request.args.get('post_id'))
#Do something to update the database
return flask.jsonify({'success':'True'})
Я предлагаю вернуть ответ json
ified, чтобы вы могли обрабатывать ошибки, которые могут возникнуть, например, если пользователю нравится публикация дважды. Если вы обнаружите, что это так, то вы можете вернуть flask.jsonify({'success':'False'})
и обработать это соответствующим образом в интерфейсе.
Затем в HTML:
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<div class='post_wrapper'>
{%for p in posts%}
<div id='post_{{post.id}}'>
<p>{{p.author.username}} says:</p>
<p>{{p.body}}</p>
{%if p.upvotes%}
<button class='upvote' id='upvote_{{p.id}}'>Like <span id='upvotes_{{p.id}}'>{{p.upvotes}}</span></p>
{%else%}
<button class='upvote' id='upvote_{{p.id}}'>Like <span id='upvotes_{{p.id}}'>0</span></p>
{%endif%}
</div>
{%endfor%}
</div>
<script>
$(document).ready(function(){
$('.post_wrapper').on('click', '.upvote', function(){
var post_id = this.id.match('\\d+');
$.ajax({
url: "/update_like",
type: "get",
data: {post_id: post_id},
success: function(response) {
if (response.success === 'True'){
var like_val = parseInt($('#upvotes_'+post_id).text()) + 1;
$('#upvotes_'+post_id).text(like_val.toString());
}
else{
alert('You already liked that post!');
}
}
});
});
});
</script>
</html>