Javascript 如何在不重定向到新页面的情况下调用Django函数?

Javascript 如何在不重定向到新页面的情况下调用Django函数?,javascript,jquery,python,django,django-views,Javascript,Jquery,Python,Django,Django Views,我正在为文章制作书签。单击按钮addtobookmark时,我想在书签中添加文章 使用Django,传统的方法是通过传递文章的片段重定向到书签页面,并在views.py中处理信息 目前,在views.py中的书签页面功能下,我有一组代码将文章保存到当前用户的书签对象中 user_instance = get_object_or_404(User,username = request.user.username) userprofile_instance = get_object_o

我正在为文章制作书签。单击按钮
addtobookmark
时,我想在书签中添加文章

使用Django,传统的方法是通过传递文章的片段重定向到书签页面,并在
views.py
中处理信息

目前,在
views.py
中的书签页面功能下,我有一组代码将文章保存到当前用户的书签对象中

user_instance        = get_object_or_404(User,username = request.user.username)
userprofile_instance = get_object_or_404(UserProfile,user = user_instance)
new_readlater        = Bookmarks.objects.get_or_create(user = userprofile_instance, article_slug = slug)
在哪里,

  • User
    是内置的Django用户
  • UserProfile
    扩展为
    User
    model
  • Bookmarks
    是与
    UserProfile
    的单一关系

    class Bookmarks(models.Model):
        user = models.ForeignKey(UserProfile, default = 1)
        read_later = models.CharField(default = "", max_length = 120) 
    

我知道,可以通过重定向到书签页面url来调用书签功能,从而保存书签。但我不想重定向到书签页面,而是想将其添加到文章页面本身。如何调用在单击按钮时处理书签信息的相同书签保存功能

如果我理解您的问题,您需要做的是在提交网页中的按钮时进行ajax POST调用:

$.ajax({
        url: "url_to_call",
        type: "POST",
        data: {  csrfmiddlewaretoken: "{{ csrf_token }}", //django needs this
                 data_item: mydata},
        timeout:0,
        success: function(data){//do something when done
                          //data will be the string returned by HTTPResponse
        }
}
并在your views.py中返回一个
HTTPResponse

response = HttpResponse("Here is some data to send back to the webpage")

这将使您保持在同一页面上,而无需重定向

,因为您似乎从所使用的标记中知道,您将使用Javascript实现这一点。你的问题到底是什么?@DanielRoseman:我已经编辑了这个问题,详细阐述了需求。谢谢。我对ajax非常陌生,但这很有效。在
data
下,
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken')。val()是它工作所必需的,否则它抛出
403
无效的
csrf令牌
错误。@build\u code抱歉,我忘了添加那个。我对答案进行了编辑,将其包括在内。如果您使用Django模板,您只需输入{csrf_token}我在模板中的每个表单下都提到了
{%csrf_token%}
,但仍然抛出403错误。我意识到,
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]')。val()
需要存在才能工作。知道为什么吗?