我试图实现一个注解系统而不重新加载页面,但它不工作。注解只在页面重新加载后插入,但AJAX不工作。
<!-- COMMENT -->
<div class="comment-section">
<form action="{% url 'love:comment_urls' %}" method="POST" class='comment-form'>
{% csrf_token %}
<input type="hidden" name="post_id" value={{i.pk}}>
{{ comment_form }}
<button type="submit" name="submit_c_form">
Опубликовать
</button>
</form>
</div>
<hr>
<div class="comment_set">
{% if i.quotes_comment.all %}
{% for com in i.quotes_comment.all %}
<b>{{ com.user }}:</b>
{{ com.body }}
{% endfor %}
{% endif %}
</div>
</div>
JS代码
// COMMENT
$(document).ready(function () {
$('.comment-form').submit(function () {
event.preventDefault();
console.log($(this).serialize());
var url = $(this).attr('action')
$.ajax({
type: 'POST',
url: url,
data: $(this).serialize(),
dataType: 'html',
success: function (response) {
console.log('Заработало')
$('.comment-section').html(response['form']);
},
error: function (rs, error) {
console.log(rs, error)
}
})
})
})
正如我所说的,注解只在重启后插入,但是当我点击发布时,什么也没发生。如果你把dataType改为'json',解析器错误就会弹出。你能解释一下我做错了什么吗?
1条答案
按热度按时间hof1towb1#
很难说你做错了什么,总的来说,代码丢失了。但是从你分享的内容来看,
csrf_token
不在AJAX请求header
中。主要是,通过使用JQuery .serialize(),你试图以URL编码的符号传递数据,而不是作为JSON对象。这个
.serialize()
输出将被用来传递数据作为一个查询字符串,通过将其附加到一个基本URL。并且,在视图中使用request.GET.get('parameter')
访问它。相反,我们想要的是传递数据作为JSON
,并通过request.body
在视图级别访问它。下面是一个完整的例子:
models.py
urls.py
两个视图,一个用于呈现模板,另一个用于处理AJAX请求。棘手的部分是试图找到一种与模板相同的format date方法。
views.py
在第一个模板部分中,我们只显示数据,请注意,
{# % if not has_commented % #}
被注解掉了,在第一次编写代码时,我将注解数量限制为每个User
一个。邮件详情. html(HTML和DTL):
第二部分包含
<script>
,负责添加新注解后模板中的每个事件。第一个函数用于从cookie中检索csrftoken值。然后,在
submit
上单击我们收集数据并发送AJAX请求。注意几行。首先,其中csrf头名称设置为headers: {'X-CsrfToken': csrftoken}
。其次,其中数据为converted to JSON stringdata: JSON.stringify({ post_id: post_id, body: body })
。邮政_详细信息. html(JS):
最后,如果成功,清除body输入并通过将数据附加到
<div id="comment-list">
来更新模板。