2014-01-16 56 views
0

我對Django和jQuery相當陌生,而且我無法從我的Django模型中獲取數據到我的jQuery中。將數組返回給.get從Django視圖中調用?

My Django models look like this: 

class Exercise(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length=500) 
    rounds = models.IntegerField() 

class Task(models.Model): 
    Exercise = models.ForeignKey(Exercise) 
    task = models.CharField(max_length=100) 
    solution = models.CharField(max_length=100) 
    description = models.CharField(max_length=500, blank=True) 
    difficulty_level = models.IntegerField() 

我的jQuery:

var tasks = []; 

// set up tasks 
tasks.push(task("hun kaldes lilletøs","hun kaldes Lilletøs","Ret sætningen nedenfor, så der bliver stavet med store bogstaver efter reglerne.","Help tekst","Feedback tekst","2")); 
tasks.push(task("john johnson","John Johnson","Ret sætningen nedenfor, så der bliver stavet med store bogstaver efter reglerne.","Help tekst","Feedback tekst","1")); 
tasks.push(task("han hedder bent","han hedder Bent","Ret sætningen nedenfor, så der bliver 

function task(text,solution, description, help, feedback, level){ 
    return { 
     text:text, 
     solution:solution, 
     description:description, 
     help:help, 
     feedback:feedback, 
     level:level, 
    } 
} 

我創建了jQuery的第一次,我爲此希望有一種方式來獲得Django的數據到jQuery中我的數據結構。我的其餘jQuery非常依賴於以這種格式的數據。

以下是我到目前爲止: 從我的搜索我已經確定了兩種不同的可能方法。通過Django的模板語言直接解析數據到jQuery或通過ajax加載數據。我不知道哪種方法最有效率,以及應該如何去做到最好,但出於某些原因,我認爲使用Ajax是最好的解決方案。

jQuery .load方法似乎不是最合適的,因爲它的構建是直接將數據加載到HTML中。

jQuery .get方法可能可以做到這一點。下面是我試圖做什麼:

Views.py

def get_tasks(request): 
    task_list = Task.objects.filter(Exercise_id=1) 
    return HttpResponse(task_list) 

jQuery

$.get("/get_tasks") 
      .done(function(data) { 
       var test = [] 
       test.push(data); 
       alert(test) 
      }); 

工作本身阿賈克斯。數據被檢索,但它只顯示unicode表示,而不是對象。這可能是因爲我應該以另一種方式返回而不是HttpResponse,我只是沒有想到如何做到這一點。

所以問題是,我如何返回一個數組從Django視圖的jQuery .get調用?

編輯:

Here's the code I have so far, it's giving me a 500 error with the jQuery call though  

import simplejson 
from django.http import HttpResponse 
def get_tasks(request): 
    task_list = Task.objects.filter(Exercise_id=1) 
    tasklist = dict((x.id, { 
     'task': x.task, 
     'solution': x.solution, 
     }) for x in task_list) 
    return HttpResponse(simplejson.dumps(dict(isOk=1,tasklist=tasklist))) 
+0

如果您有DEBUG = True,那麼您應該能夠看到使用Chrome瀏覽器查看Django調試消息,通過開發人員工具>網絡>>響應。 – skoll

回答

2

您的看法這個樣子的

import simplejson 
def get_tasks(request): 
    task_list = Task.objects.filter(Exercise_id=1) 
    tasklist = dict((x.id, { 
     'field1': x.your_filed_name1, 
     'field2': x.your_filed_name2, 
    }) for x in task_list.iterator()) 
    return HttpResponse(simplejson.dumps(dict(isOk=1,tasklist=tasklist))) 

您的jQuery像這樣

$.get("/get_tasks") 
      .done(function(data) { 
       console.log(data.tasklist) 
      }); 
+0

謝謝。我剛剛嘗試執行此操作,並且在異常位置「/Library/Python/2.7/site-packages/django/utils/importlib.py in import_module,line 35」中出現無效的語法錯誤。異常被拋出在視圖的最後一行。我已經檢查過,simplejson已經安裝,但無法真正弄清楚錯誤是什麼。 – Splurk

+0

你可以在這裏通過你的代碼嗎?所以會弄清楚和糾正。並請檢查最後一行:return HttpResponse(simplejson.dumps(dict(isOk = 1,tasklist = tasklist)))是正確的。 –

+0

稀釋是的,當然,在這裏它是: 進口simplejson DEF get_tasks(請求): task_list = Task.objects.filter(Exercise_id = 1) 任務列表=字典((x.id,{ '文本': x), 'solution':x.solution, })for task_list.iterator()) return HttpResponse(simplejson.dumps(dict(isOk = 1,tasklist = tasklist))) – Splurk

1

霸通過Django的模板 語言直接將數據解析爲jQuery,或通過AJAX加載數據。我不知道哪種方法是 最有效的

你應該使用AJAX,如果你從服務器獲取數據上的一些用戶的選擇取決於頁面上,或者如果數據量是巨大的,否則會緩慢頁面的加載。否則,請使用Django模板來將值加載到您的javascript中。

如果您確實需要AJAX,我建議您查看http://www.dajaxproject.com/。在Django中簡化AJAX調用是一個很好的小型庫。

下面是它會怎樣看與Dajaxice(從頁面到Django的參數傳遞的追加例題):

應用程序/ ajax.py:

from dajaxice.decorators import dajaxice_register 
from django.utils import simplejson 
from app.models import Task 

@dajaxice_register(method='GET') 
def get_tasks(request, exercise_id): 
    task_list = Task.objects.filter(Exercise_id=exercise_id) 
    return simplejson.dumps(task_list) 

JS:

function get_tasks_callback(data){ 
    console.log(data); 
} 
var params = {'exercise_id': 1} 
Dajaxice.app.get_tasks(get_tasks_callback, params); 
+0

謝謝。很高興有更多的基礎,而不僅僅是我的直覺。我會堅持ajax。我會看看dajaxproject,看看我能否弄清楚:-) – Splurk