Javascript Ajax/jQuery Django元素刷新类
我没能想出一个更合适的标题,但我的问题如下:Javascript Ajax/jQuery Django元素刷新类,javascript,python,jquery,django,ajax,Javascript,Python,Jquery,Django,Ajax,我没能想出一个更合适的标题,但我的问题如下: $(document).on('submit','.likeform',function(e){ e.preventDefault(); $.ajax({ type:'POST', url:'{% url 'like' %}', data:{ post_id: $('#post_id').val(),
$(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 > *");
}
});
我生成了一个帖子列表,可以选择喜欢和不喜欢它们,这取决于它们是否已经被喜欢
{% 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 %}
POST请求可以正常工作,但success:functionpart不能。它刷新所有按钮,这不是很好,但它也把所有的按钮以各种形式。目前,我的数据库中有6篇文章,在$.likeform.load.likeform>*之后的每篇文章下都有6个喜欢/不喜欢按钮;已经完成了
如何在保持for循环中生成的按钮的同时,只刷新按钮的正确实例?
有没有办法利用post_id识别相关按钮?因为您说页面上有多个这样的表单,所以请丢失输入上的id属性并将其更改为name属性
<input type="hidden" name="post_id" value="{{ post.id }}">
您可以将post_id发送回成功回调,并使用它选择正确的输入元素。感谢您的快速响应!正如你可能知道的,我对JS/JQ/AJAX很陌生-这是怎么做到的?你打算用CSS显示和隐藏按钮,还是完全从HTML中删除和替换按钮?我的想法基本上是通过在views.py中向后端发送一个新的请求来刷新按钮。随后的post_id列表将生成并传递到确定按钮文本的模板基于此列表。我不确定这在当时是否可行,因为基本上需要重新渲染整个模板才能工作,或者我遗漏了什么?不,你做得很好。幸运的是,您不必重新渲染所有内容。作为服务器的响应,您可以发送按钮的HTML,以替换旧按钮。如果您能够修改响应,以发送字符串上的按钮,例如:厌恶,那么这将非常简单。或者甚至只是喜欢和不喜欢的文字就可以了。好吧,到目前为止我可以跟你说,但是buttonText的设置需要怎样的反应呢?我可以在函数中返回'Like'吗?喜欢你的帖子。保存返回像这样的“不喜欢”吗?为了进一步解释:/like/是接收ajax帖子的端点,my views.py中的函数是否应该只返回一个字符串,或者如何返回该字符串?响应应该是喜欢还是不喜欢,取决于您发送的具有帖子id的帖子现在是否喜欢。如果喜欢,就发不喜欢。如果不喜欢就发喜欢。这就像一个开关。我编辑我的评论是为了更具体——我质疑是否必须发回json对象、字符串、HttpResponse或其他任何东西,因为我不知道成功部分是如何获得响应数据的——在本例中是字符串。因为我们只需要一个值:按钮的文本。success回调函数有两个参数,第一个是响应的主体。这是访问响应值的方法。我已经更新了回调中的参数,使其更清晰。我做了一点实验——用一个字符串,我从Django那里得到了一个异常,用一个HttpResponse“Like”它可以工作——我真是太感谢你了。像你这样的人让世界变得更美好。
$(document).on('submit', '.likeform', function(e) {
e.preventDefault();
// Get the currently submitted form and find the inputs
// inside the form necessary to send the data with.
var $form = $(this);
var $postId = $form.find('input[name="post_id"]');
var $csrf = $form.find('input[name="csrfmiddlewaretoken"]');
var $button = $form.find('button');
$.ajax({
type: 'POST',
url: '{% url 'like' %}',
dataType: 'text',
data: {
post_id: $postId.val(),
csrfmiddlewaretoken: $csrf.val()
},
success: function(response) {
// Replace the current text of the button with a new
// text based on if it was liked or disliked.
$button.text(response);
}
});
});