从 Ajax 调用 Django 视图

Posted

技术标签:

【中文标题】从 Ajax 调用 Django 视图【英文标题】:Calling Django View from Ajax 【发布时间】:2015-10-30 23:18:24 【问题描述】:

我正在使用 Ajax(连同 Django)对按钮单击执行一些操作。我成功调用了 javascript 函数,但我无法调用 Django 视图。没有错误但我认为打印语句不打印...?

urls.py

urlpatterns = patterns('polls.views',
    url(r'^request_access/$', 'request_access',
        name='request_access'),
)

views.py

def request_access(request):
    print("DJANGO VIEW")
    if request.method == "POST":
        print("DATA: ", request.POST.get('request_data'))
        return HttpResponse(
            json.dumps(response_data),
            content_type="application/json"
        )

模板.html

<button class="btn btn-green btn-sm" onclick="request_access(this)" id=" data "><i class="fa fa-plus"></i> Join Group</button>

javascript.js

function request_access($this)
    console.log("button clicked");
    var request_data = $this.id;
    console.log("data: " + request_data);
    $.post(
        url: "request_access/",
        data :  request_data: request_data,
        success : function(json) 
            $("#request-access").hide();
            console.log("requested access complete");
        
    )

【问题讨论】:

【参考方案1】:

将代码中的“post”替换为“ajax”,现在打印语句将在您的视图中运行。

function request_access($this)
    console.log("button clicked");
    var request_data = $this.id;
    console.log("data: " + request_data);
    $.ajax(
        url: "request_access/",
        data :  request_data: request_data,
        success : function(json) 
            $("#request-access").hide();
            console.log("requested access complete");
        
    )

Difference between $.post and $.ajax?

$.post vs $.ajax

【讨论】:

谢谢@chandu,它越来越近了,但打印语句没有显示。我收到500 (INTERNAL SERVER ERROR) ? 我添加了type: "POST",,现在我得到了403 (FORBIDDEN) @steph 在您的数据中添加 csrfmiddlewaretoken。 , 'csrfmiddlewaretoken':$.cookie('csrftoken'),【参考方案2】:

这将返回空值。

views.py

def request_access(request):
    print("DJANGO VIEW")
    a = request.POST.get('request_data')
    print a
    return HttpResponse(json.dumps(a),content_type="application/json")

js

function request_access($this)
    console.log("button clicked");
    var request_data = $this.id;
    alert(request_data);
    console.log("data: " + request_data);
    $.ajax(
        type: 'GET',
        url: "/crm/request_access/",
        data :  'request_data': request_data,
        success : function(json) 
            $("#request-access").hide();
            console.log("requested access complete");
        
    )

【讨论】:

【参考方案3】:

我遇到了同样的问题,即我的视图没有错误,但我的视图没有被调用。 这是我解决它的方法:

我试图获取以下网址:

url(r'users/change_rights', 'change_user_right', name='change_user_right'),

但 users/change_rights 网址也与我注册的另一个网址匹配:

url(r'users', 'users_table', name='users_table'),

所以 django 只是调用了第一个非 ajax 视图并没有返回任何错误。

要修复它,请在第二个 url 的末尾添加一个“$”,这样它就不会包含 users/change_rights:

url(r'users$', 'users_table', name='users_table'),

【讨论】:

以上是关于从 Ajax 调用 Django 视图的主要内容,如果未能解决你的问题,请参考以下文章

从 AJAX 请求调用 django 视图(解析 celery task_id)

django ajax 代理视图

通过jQuery ajax调用将值列表传递给django视图

Django - 从模板内部调用带有表单的视图

如何在 Django 中设置 AJAX 调用的视图/路径?

如何在django中使用类似AJAX的视图?