2016-06-21 19 views
0

次の構造を持つDjangoプロジェクトがあります。私のプロジェクト名はSimpleWebです。私はというクエリというアプリケーションを持っています。今私は、ドロップダウンメニューと送信ボタンを持つHTMLページがあります。Django:JavascriptからPython関数を呼び出すことができません

ここに私がやろうとしていることがあります。ユーザーがドロップダウンから項目を選択して送信すると、view.pyファイルでPython関数を呼び出し、その項目で何かを行い、リストを返します。

問題は、何らかの理由でrunQueryという名前の関数が呼び出されていないと思います。以下は私のコード

SimpleWeb \です

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 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()関数が正しく呼び出されていないのです。私はこれを解決する方法を知らない。ありがとうございました:)

答えて

1

URLが正しく定義されていないため、ルータが正しい方法を見つけられません。あなたはURLを定義することができ片道:

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

クエリ\のURL urls.py

SimpleWeb \。view.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'), 
] 
PY
ここでは、JSONオブジェクトを返す必要があります。 HttpResponseを使用してそれを返す1つの方法は、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") 
+0

ありがとうございます。しかし、私の 'script.js'ファイルでは' params:{yourChoice:userInput} 'を渡すので、私のrunQuery()関数で' userInput'にアクセスするにはどうすればいいですか? –

+0

ようこそ。 '' request.GET.get( 'yourChoice') ''を使用してrunQueryメソッドでyourChoiceにアクセスできます。 '' –

+0

よろしくお願いします。 –

1

あなたの同僚は、あなたに冗長であるurls.pyの定義は正しいです。

今のところ、メインアプリのSimpleWeb/urls.pyを使用して、そこからURLを作成してください。それを取得したら、それらを部分に分けてインポートする方法を学ぶことができます。

これはあなたが探しているURLだと思います。

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

それはlistを返しますが、それはJSONエンコードされた文字列としてリストを返すためにstr

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

使用Django's JsonResponse()を返すことがあるため、次の問題は、あなたは、によってRunQuery図です。

関連する問題