Javascript 单击按钮并在django中使用JS/ajax从views.py运行python函数

Javascript 单击按钮并在django中使用JS/ajax从views.py运行python函数,javascript,python,django,ajax,Javascript,Python,Django,Ajax,这几天我一直在读关于当我按下按钮时如何调用python函数,我非常困惑。我看到的一件事是,我必须使用ajax,而大多数人都使用jquery来实现这一点 如果我理解正确,结构必须与此相似 $(document).ready(function() { $.ajax({ url: '', type: '', data: {'A':0}, dataType:'', success: function(resp){

这几天我一直在读关于当我按下按钮时如何调用
python函数
,我非常困惑。我看到的一件事是,我必须使用
ajax
,而大多数人都使用
jquery
来实现这一点

如果我理解正确,结构必须与此相似

$(document).ready(function() {
    $.ajax({
        url: '',
        type: '',
        data: {'A':0},
        dataType:'',
        success: function(resp){
            console.log(resp);
        }
    });
});
有了这些信息,我的最终代码是

视图.py

def vista_sumar(request):
    if request.method == 'POST':
        a = request.POST['a']
        b = request.POST['b']
        c = int(a) + int(b)
        ctx = {'Result':c}

    return render(request,'main.html',ctx)
from project.views import vista_sumar

urlpatterns = [
    path('prueba/',vista_sumar),
]
url.py

def vista_sumar(request):
    if request.method == 'POST':
        a = request.POST['a']
        b = request.POST['b']
        c = int(a) + int(b)
        ctx = {'Result':c}

    return render(request,'main.html',ctx)
from project.views import vista_sumar

urlpatterns = [
    path('prueba/',vista_sumar),
]
main.html

<input type="button" value="PRUEBA" class="boton">

<script src="{% static '/js/jquery-3.4.1.min.js' %}"></script>
<script type="text/javascript" src="{% static '/js/filters.js' %}"></script>
我知道按钮正在工作,因为第一个
警报正在工作。问题是当我使用
ajax

代码错误为403=Forbbiden,在
ajax.send()中失败

有人能帮我吗

编辑 在@epikstar的帮助下,我解决了一件事,我忘记了
CSRF
。我在我的
js文件中添加了

$('#prueba').click(function() {
    alert('boton pulsado');
    var csrftoken = $("[name=csrfmiddlewaretoken]").val();
    alert(csrftoken)
    a =1;
    b =3;
    $.ajax({
        url: '/../../prueba/',
        type: 'POST',
        headers:{"X-CSRFToken": csrftoken},
        data: {
            'a': a,
            'b': b, 
        },
        dataType: "json",
        cache: true,
        success: function(response) {
            alert('succes')
            alert(response.Result);
        }
    });
    alert('fin') 
});
我在我的
视图中导入了.py

from django.template.context_processors import csrf
我在我的
main.html

<input type="button" value="PRUEBA" id="prueba">{% csrf_token %}
它打印
4

但是我添加了一个
console.log(response)
控制台.log(响应.结果)
成功
中,不返回任何内容


非常感谢。

您应该像这样添加CSRF令牌:

var csrftoken = $("[name=csrfmiddlewaretoken]").val();
//example ajax
$.ajax({
    url: url,
    type: 'POST',
    headers:{
        "X-CSRFToken": csrftoken
    },
    data: data,
    cache: true,
});
也可以直接从django变量添加:

 $.ajax({
         type: 'POST',
         headers:{
        "X-CSRFToken": '{{ csrf_token }}'
         }
  })

查看此处以了解csrf令牌的作用:

首先,您试图访问
响应.Result
,这是不可能的,因为您正在从函数返回html视图。要么从函数返回
json
响应,要么创建另一个返回
json
响应的函数。第二,您的
url
在ajax请求中不正确,它不是文件位置,可能应该是
/prueba
。如果您只更正
url
并提醒
响应
,您应该能够在警报中看到html响应。对于这个愚蠢的问题,很抱歉,但是您能否帮助更正
响应
?我不知道该怎么做:(当我删除斜杠时,会出现以下错误:
RuntimeError:您通过POST调用了此URL,但URL没有以斜杠结尾,并且您设置了APPEND_斜杠。Django在维护POST数据时无法重定向到斜杠URL。请将表单更改为指向127.0.0.1:8000/prueba/(注意后面的斜杠),或在Django设置中设置APPEND_SLASH=False。
我看到了此信息,但我认为我不需要它,因为我没有使用
表单。
。尽管如此,我还是在代码中添加了您的第一个脚本,错误是相同的。可能是个愚蠢的问题,但我不知道如何解决。您正在撰写帖子,因此需要CSRF。是否导入了它?但它确实存在有必要吗?因为我正在使用
render
。好的,我从django.template.context\u处理器导入csrf
,并在我的
输入之后添加了这一行
{%csrf\u token%}
如手册所述。但是在
成功中没有显示警报
那么我在传递或恢复变量时又犯了一个错误…:(使用console.log进入success函数以确保它传入