【问题标题】:How to invoke a Django function without redirecting to a new page?如何在不重定向到新页面的情况下调用 Django 函数?
【发布时间】:2017-08-17 14:33:21
【问题描述】:

我正在为文章添加书签。单击按钮Add To Bookmark时,我想将文章添加到书签中。

使用 Django,传统的做法是通过传递文章的 slug 重定向到书签页面,并处理 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 模型。
  • Bookmarks 是与 UserProfile 的 OneToMany 关系。

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

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

【问题讨论】:

  • 正如您从使用过的标签中知道的那样,您将为此使用 Javascript。你的问题到底是什么?
  • @DanielRoseman :我已经编辑了问题,详细说明了需求。

标签: javascript jquery python django django-views


【解决方案1】:

如果我理解您的问题,您需要做的是在网页中提交按钮时进行 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
        }
}

在你的views.py中返回一个HTTPResponse

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

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

【讨论】:

  • 谢谢..我对 ajax 真的很陌生,但这很有效。在data 下,需要csrfmiddlewaretoken : $('input[name = csrfmiddlewaretoken]').val() 才能工作,否则会抛出403 invalid csrf token 错误。
  • @build_code 抱歉,我忘了补充。我已经编辑了答案以包含它。如果你使用 Django 模板,你可以只输入 {{ csrf_token }}
  • 我在模板中的每个表单下都提到了{% csrf_token %},但仍然抛出 403 错误。我意识到csrfmiddlewaretoken : $('input[name = csrfmiddlewaretoken]').val() 需要在场才能正常工作。知道为什么吗?
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 2012-04-10
  • 2020-08-29
  • 2011-10-31
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多