我已经为此奋斗了几天。我已经阅读了许多有关Django项目的帖子,博客和观看视频演示,但是没有什么能解决我的问题。
我有一个使用Python API的Django网络应用程序,该应用程序连接到第三方服务以分析文本数据。用户写入文本区域,按下按钮,然后将文本发送到服务,该服务返回JSON对象列表。对该服务的API调用是Python函数。我试图使用Ajax在按下按钮时使用文本数据作为参数对Python函数进行异步调用。
目前,我还没有尝试调用我的第三方服务。我只是想看看我是否可以从Python发送输入和接收输出中得到响应。
我发现的大多数示例都涉及创建表单并提交表单,因此Django框架自动将其称为Python函数。表单不完全是我要构建的表单,也不是要进入新页面来查看结果或刷新当前表单。
<!-- index.html -->
<html>
<head>
<title>Test Data</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
document.getElementById("Button").addEventListener('click', analyzeText());
function analyzeText(){
var text = document.getElementById('text-to-analyze').value;
$ajax({
type: "POST",
url: "/models.py", /* Call python function in this script */
data: {param: text}, /* Passing the text data */
success: callback
});
}
function callback(response){
console.log(response);
}
</script>
</head>
<body>
<textarea id="text-to-analyze" rows="12" cols="100"></textarea><br>
<button id="button" value="Analyze"/>
</body>
</html>
# models.py
from django.db import models
# Function I want to call from Ajax
def testcall():
return 'test successfull'
编辑:
我几乎可以正常工作了。我只是无法理解的ajax出现语法错误。
Could not parse the remainder: ' 'ajax-test-view'' from 'url 'ajax-test-view''
编辑
我修复了所有语法错误,但是现在尝试执行目标python脚本时遇到404错误。我现在了解url和路径在Django中的工作原理,但是使用Kostadin Slavov的解决方案,如何在不路由到特定html的情况下做到这一点?
在ajax中,我像这样设置URL:
url: '{{ 'ajax-test-view' }}',
在我的python中,我将url模式设置如下:
path(r'^django-app/$', views.testcall, name = 'ajax-test-view'),
似乎ajax url中的变量指向url模式中的name字段,但这也似乎是要渲染的特定html文件的名称(?)还是py函数的名称?
当我单击我的按钮时,ajax向
http://localhost:8000/what-ever-the-name-field-is-in-the-url-pattern
发送命令,并从中获得404。框架是试图加载页面还是意味着找不到我的python文件?Derp ...重要的是要知道
url: '{{ 'ajax-test-view' }}',
是ajax将请求的URL地址,并且Django的url调度程序仅在路径完全匹配时才拦截它以执行其他操作。最终编辑
得到它的工作。我在Kostadin Slavov的解决方案中更改了几件事:
# urls.py
urlpatterns = [
url(r'^$', views.index, name = 'index'),
path('my-ajax-test/', views.testcall),
]
<!-- index.html -->
<script>
....
var text = "test successful";
$.ajax({
type: "POST",
url: '{{ 'my-ajax-test/' }}',
data: { csrfmiddlewaretoken: '{{ csrf_token }}', text: text },
success: function callback(response){
console.log(response);
}
});
</script>
# views.py
def testcall(request):
return HttpResponse(request.POST['text'])
最佳答案
在urls.py
中创建一个url
path('my-ajax-test/', views.myajaxtestview, name='ajax-test-view'),
那么你的ajax应该看起来像
注意
csrf_token
否则将向您发送错误 $ajax({
type: "POST",
url: '{{ url 'ajax-test-view'}}',
data: {csrfmiddlewaretoken: '{{ csrf_token }}',
text: "this is my test view"}, /* Passing the text data */
success: function(response){
alert(response);
}
});
在
views.py
中def myajaxtestview(request):
return HttpResponse(request.POST['text'])
摘要:
您需要在
url
中创建urls.py
,这会导致您的views.py
然后该视图将获取您在
request.POST
中的request
中发送的数据,您有大量的数据here。在您的情况下,您对
request.POST
更感兴趣,这是一个python字典所以您选择已发送的参数并使用它
您可以像
return HttpResponce('test'+ request.POST['text'])
一样玩如果您想从
models.py
那里得到一些东西,假设您从js发送的数据是{object_type: hammer}
def myajaxtestview(request):
look_for = request.POST['object_type']
#lets say you have model Items
my_items= serializers.serialize('json', Items.objects.filter(object_type=look_for))
return JsonResponse(my_items)
关于python - 如何在Django中从JavaScript调用Python函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51106830/