【发布时间】:2020-01-29 22:43:23
【问题描述】:
我无法想出更合适的标题,但我的问题如下:
我会生成一个帖子列表,其中包含喜欢和不喜欢它们的选项,具体取决于它们是否已经被喜欢。
{% for post in posts %}
<hr>
<strong>{{ post.owner }}</strong> </br>
{{ post.content }} </br>
<i>{{ post.post_date }}</i> </br>
<form action="{% url 'like' %}" method="post" class="likeform">
{% csrf_token %}
<input type="hidden" id="post_id" value="{{ post.id }}">
{% if post.id not in liked_posts_ids %}
<button type="submit" >Like</button>
{% else %}
<button type="submit" >Dislike</button>
{% endif %}
</form>
{% endfor %}
现在,就像所有使用此类内容的网站一样,我不想在每次有人点击喜欢/不喜欢按钮时刷新整个网站。
我当前的 JS 如下所示:
$(document).on('submit','.likeform',function(e){
e.preventDefault();
$.ajax({
type:'POST',
url:'{% url 'like' %}',
data:{
post_id: $('#post_id').val(),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
$(".likeform").load(" .likeform > *");
}
});
POST 请求工作正常,但 success:function()part 不能。它刷新所有按钮,这不是很好,但它也将所有按钮置于所有形式中。目前我的数据库中有 6 个帖子,在 $(".likeform").load(" .likeform > *"); 完成后,每个帖子下都有 6 个喜欢/不喜欢按钮。
如何只刷新按钮的正确实例,同时保留在 for 循环中生成的按钮?
有没有办法利用#post_id来识别相关按钮?
【问题讨论】:
-
您可以在
success回调中发回post_id并使用它来选择正确的输入元素。 -
感谢您的快速回复!您可能会说,我对 JS/JQ/AJAX 很陌生 - 这是如何完成的?
-
您打算用 CSS 显示和隐藏按钮,还是从 HTML 中完全删除和替换按钮?
-
我的想法基本上是通过对后端的新请求来刷新它们(在views.py中,生成了跟随的post_ids列表并将其传递给模板,其中按钮文本根据此列表确定. 我不确定这是否可能,因为它基本上必须重新渲染整个模板才能工作,还是我错过了什么?
-
不,你做得很好。幸运的是,您不必重新渲染所有内容。作为来自服务器的响应,您可以发送应该替换旧按钮的按钮的 HTML。如果您能够修改响应以在字符串上发送按钮,例如:
"<button type="submit" >Dislike</button>",那么这将非常容易。甚至只是Like和Dislike的文本也可以。
标签: javascript python jquery django ajax