2016-06-21 4 views
0

У меня есть проект Django со следующей структурой. Мое имя проекта: SimpleWeb. У меня есть приложение с именем запрос. Теперь у меня есть страница HTML, в которой есть раскрывающееся меню и кнопка отправки.Django: Невозможно вызвать функцию python из Javascript

Вот что я пытаюсь сделать. Когда пользователь выбирает элемент из раскрывающегося списка и отправляет запросы, я хочу вызвать функцию python в моем файле view.py, сделать что-то с этим элементом и вернуть список обратно.

Проблема в том, что по какой-то причине моя функция с именем 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"); 
    }); 
}; 
}]); 

Опять же, я отправил большую часть кода, который я думал, было уместным, и может помочь вам найти решение. Мой коллега сказал мне, что способ, которым я определил runQuery в моем файле urls.py, может быть испорчен, и поэтому функция runQuery() не получила правильное название. Я не знаю, как это исправить. Спасибо вам:

ответ

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.ру

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") 
+0

Спасибо, он отлично работает сейчас. Просто быстрый вопрос, хотя, поэтому в моем файле 'script.js' я передаю' params: {yourChoice: userInput} ', так как мне получить доступ к userInput в моей функции runQuery()? –

+0

Добро пожаловать. Вы можете получить доступ к вашему элементу в методе runQuery, используя '' request.GET.get ('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), 
] 

Следующая проблема заключается вы 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) 
Смежные вопросы