繁体   English   中英

Django:无法从Javascript调用python函数

[英]Django: Unable to call python function from Javascript

我有一个具有以下结构的Django项目。 我的项目名称为SimpleWeb 我有一个名为query的应用程序。 现在,我有一个HTML页面,其中包含一个下拉菜单和一个提交按钮。

这是我想要做的。 当用户从下拉列表中选择一个项目并点击“提交”时,我想在我的view.py文件中调用一个python函数,对该项目进行操作并返回一个列表。

问题是我出于某种原因未调用名为runQuery函数。 下面是我的代码

SimpleWeb \\ urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^runQuery/$', include('query.urls')),
    url(r'^$', include('query.urls')),
]

查询\\ urls.py

from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^runQuery', views.runQuery, name='runQuery'),
]

view.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    # this function powers the main page: 'http://127.0.0.1:8000/'
    List = ['item1','item2','item3']
    return render(request, 'query/home.html', {'list': List})


def runQuery(request):
    # this function needs to be called using $http from javascript 
    # I want to get what user submitted in $http and do something with it here
    # then return a list, below is a sample list 
    fruitList = ['apple', 'banana', 'orange']
    return HttpResponse(fruitList)

script.js

angular.module('myApp', []);
angular.module('myApp').controller('myCtrl', ['$scope', '$http', function ($scope, $http) {

$scope.submitButtonclicked = function(){
    var userInput = $scope.data.dropdown /* item that user chooses from dropdown*/

    $http({
        method: 'GET',
        url: '/runQuery',
        params: {yourChoice: userInput}
    }).then(function successCallback(response){
        console.log(response); /* When I debug in chrome browser, I see that it logs an HTML page as the response instead of fruit list */
    }, function errorCallback(response) {
        console.log("Oops, error occurred");
    });
 };
}]);

再次,我发布了大部分我认为相关的代码,可能会帮助您找到解决方案。 我的同事告诉我,我在urls.py文件中定义runQuery的方式可能会弄乱,这就是为什么runQuery()函数未正确调用的原因。 我不知道该如何解决。 谢谢 :)

您的同事是正确的,您在urls.py定义中是多余的。

现在,仅使用主应用程序的SimpleWeb/urls.py并从那里构建URL。 掌握了这些知识之后,您就可以学习如何将它们分成多个部分并导入。

我想这些是您要查找的URL。

# SimpleWeb/urls.py
urlpatterns = [
    url(r'^$', query.views.index),
    url(r'^runQuery$', query.views.runQuery),
]

下一个问题是您的runQuery视图,因为它返回一个list ,但是必须返回一个str

def runQuery(request):
    fruitList = ['apple', 'banana', 'orange']
    return HttpResponse(fruitList)  # --> error: this is not a str!

使用Django的JsonResponse()以JSON编码的字符串形式返回列表。

def runQuery(request):
    fruitList = ['apple', 'banana', 'orange']
    return JsonResponse(fruitList)

您没有正确定义URL,因此路由器找不到正确的方法。 定义URL的一种方法:

SimpleWeb \\ urls.py

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'', include('query.urls')),
]

查询\\ urls.py

from django.conf.urls import include, url
from . import views
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^runQuery', views.runQuery, name='runQuery'),
]

view.py

在这里,您需要返回一个JSON对象。 使用HttpResponse返回它的一种方法是使用simplejson。

from django.shortcuts import render
from django.http import HttpResponse
from django.utils import simplejson

def index(request):
     # this function powers the main page: 'http://127.0.0.1:8000/'
     List = ['item1','item2','item3']
     return render(request, 'query/home.html', {'list': List})


def runQuery(request):
    # this function needs to be called using $http from javascript 
    # I want to get what user submitted in $http and do something with it here
    # then return a list, below is a sample list 
    fruitList = simplejson.dumps("fruitlist" : ['apple', 'banana', 'orange'])
    return HttpResponse(fruitList, content_type ="application/json")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM