Django:在不重新加载页面或渲染到另一个页面的情况下在表单提交上发出 POST 请求?

Sim*_*nov 1 javascript django ajax jquery django-forms

我已经为这个问题苦苦挣扎了两天多,我在这里查看了类似的问题以及许多文档,但没有任何帮助。基本上,我正在构建一个 Django Web 应用程序(人们可以在其中将自己添加为朋友)我正在使用 Django 包 django-friendship,但我希望发生以下情况:当用户在其他人的个人资料中时,第一个可以单击“添加好友”按钮,必须发送好友请求。但我想在不重新加载页面或渲染到另一个页面的情况下实现这一点。为了发送请求而必须触发的方法在 views.py 中。可能我需要使用ajax,但以什么方式使用?例如,我的最终目标是在 facebook 中作为“添加朋友”按钮执行的按钮(无需重新加载)。

朋友简介.html

<form action="{% url 'users:fr_request' pk=friend.id %}" method="POST">
{% csrf_token %}
<input type="submit" value="Add friend"/>
Run Code Online (Sandbox Code Playgroud)

视图.py

def friendship_add(request, pk):
if request.method == 'POST':
    to_user = User.objects.get(pk=pk)
    from_user = request.user
    try:
        Friend.objects.add_friend(from_user, to_user)
    except AlreadyExistsError as e:
        print('Exception when adding a friend ' + e)
    else:
        return HttpResponse('You added a friend')

return render(request, 'users/friend_profile.html')
Run Code Online (Sandbox Code Playgroud)

网址.py

urlpatterns = [
url(r'users/(?P<pk>\d+)/send/$', views.friendship_add, name='fr_request'),
Run Code Online (Sandbox Code Playgroud)

]

在提交表单的那一刻,我将页面呈现给 users/(?P\d+)/send/,它调用视图方法并执行 Friend.objects.add_friend,但我希望这发生在不去 /send/ 页面的情况下或重新加载电流?

raf*_*lmp 5

这可以使用 jQuery 轻松实现。如果页面中有多个表单,您可能需要为表单分配一个 id:

<form action="{% url 'users:fr_request' pk=friend.id %}" method="POST" id="friend_form">
    {% csrf_token %}
<input type="submit" value="Add friend"/>
Run Code Online (Sandbox Code Playgroud)

脚本可能看起来像这样:

$(function() {
    $("#friend_form").submit(function(event) {
        // Stop form from submitting normally
        event.preventDefault();
        var friendForm = $(this);
        // Send the data using post
        var posting = $.post( friendForm.attr('action'), friendForm.serialize() );
        // if success:
        posting.done(function(data) {
            // success actions, maybe change submit button to 'friend added' or whatever
        });
        // if failure:
        posting.fail(function(data) {
            // 4xx or 5xx response, alert user about failure
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

有关更多信息和示例,请参阅jQuery.post() 文档