python - 如何在 Django 中使用 Ajax 来提交表单而无需重定向/刷新,同时调用 views.py 函数?
问题描述
我想创建一个为帖子添加书签的系统,其中会有一页帖子可以向下滚动,如果您特别喜欢某个帖子,可以单击一个按钮将其保存到您的书签中。我整天都在寻找一种解决方案,该解决方案允许我将帖子保存到用户的书签,同时也不刷新/重定向,但我只设法找到一次解决一个问题的方法,而不是同时解决两个问题。我对更改模板视图本身不感兴趣,而只是将数据保存到数据库中。
我的模板代码:
<form class='bookmark-form' method='POST' action="{% url 'add_bookmark' %}"
data-url='{{ request.build_absolute_uri|safe }}'> {% csrf_token %}
<input type="text" value="{{post.pk}}" name="post-pk" hidden>
<button type='submit'><img src="/img/bookmark.svg" alt=""></button>
</form>
我的阿贾克斯代码:
$('.bookmark-form').submit(function(event){
event.preventDefault()
var postData = {csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(),}
var $formData = $(this).serialize()
var $thisURL = $('.bookmark-form').attr('data-url') || window.location.href
$.ajax({
method: "POST",
url: $thisURL,
data: postData,
success: function (data) {console.log(data)},
error: function(data) {console.log("Something went wrong!");}
})
return false;
})
我的 Views.py 函数保存书签:
def add_bookmark(request):
if request.method=='POST':
pk = request.POST.get('post-pk')
post = Post.objects.get(pk=pk)
user = request.user
user.bookmarks.add(post)
user.save()
print(user.bookmarks.all())
return JsonResponse({'result': 'ok'})
else:
return JsonResponse({'result': 'nok'})
当前的结果是页面没有重新加载/重定向,但它也从不调用 add_bookmark 函数。
您可能会说我对 Ajax 也很陌生。有人可以说明我如何能够同时实现我的两个目标吗?
解决方案
您使用了错误的 URL 进行提交。您应该使用action
属性,而不是data-url
.
$('.bookmark-form').submit(function(event){
event.preventDefault()
var postData = {csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(),}
var $formData = $(this).serialize()
//var $thisURL = $('.bookmark-form').attr('data-url') || window.location.href
var form_action = $('.bookmark-form').attr('action')
$.ajax({
method: "POST",
url: form_action,
data: postData,
success: function (data) {console.log(data)},
error: function(data) {console.log("Something went wrong!");}
})
return false;
})
如果您的 HTML 不同,则基本上必须将 URL 拉到其他地方。您甚至可以在 AJAX 函数中硬编码视图的路径。
$.ajax({
method: "POST",
url: '/add_bookmark', # or whatever your URL IS
data: postData,
success: function (data) {console.log(data)},
error: function(data) {console.log("Something went wrong!");}
})
推荐阅读
- python - 从类体调用类方法
- android - android中websockets的证书固定
- python - 网页抓取时面临“''block block-block-content block-block-contente1ace621-3e0d-4b51-848d-aa830cd4a1c5”''的问题
- xcode - 找不到模块映射文件'/Users/"my_flutter_project_path"/ios/Pods/Headers/Private/openssl_grpc/BoringSSL-GRPC.modulemap'?
- json - 在Java中将JSON字符串转换为Avro GenericRecord(生成的Schema是通过相同的Json字符串)
- android - 获取 java.lang.IllegalArgumentException: width and height must be > 0 error while initializing Mat in android
- c# - 如果存在重复节点,如何查找节点
- flutter - 如何将地图列表获取到日历?[扑]
- postgresql - 在表中添加列,按组进行值分区
- c# - 对 Controller 函数进行异步调用 (void)。无法将控制权交还给 UI