【问题标题】:Django: Unable to call python function from JavascriptDjango:无法从 Javascript 调用 python 函数
【发布时间】:2016-06-21 15:04:44
【问题描述】:

我有一个具有以下结构的 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() 函数没有被正确调用的原因。我不知道如何解决这个问题。谢谢你:)

【问题讨论】:

    标签: javascript python angularjs django


    【解决方案1】:

    您没有正确定义 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")
    

    【讨论】:

    • 非常感谢,现在可以正常使用了。只是一个简单的问题,所以在我的script.js 文件中我传递了params: {yourChoice: userInput} 那么如何在我的runQuery() 函数中访问userInput
    • 不客气。您可以使用 request.GET.get('yourChoice') 在 runQuery 方法中访问 yourChoice
    【解决方案2】:

    你的同事是对的,你在 urls.py 定义中是多余的。

    目前,仅使用您的主应用的 SimpleWeb/urls.py 并从那里构建您的 URL。一旦你得到了它,你就可以学习如何将它们分成几部分并导入它们。

    我猜这些是您正在寻找的网址。

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

    下一个问题是你运行查询视图,因为它返回一个list,但它必须返回一个str

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

    使用Django's JsonResponse() 将列表作为 JSON 编码字符串返回。

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

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2011-06-15
      • 2018-12-08
      • 2013-03-20
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多