从Django View返回数组到.get调用?

时间:2014-01-16 12:04:06

标签: jquery python ajax django

我是Django和jQuery的新手,我无法将我的Django模型中的数据导入到我的jQuery中。

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)
            });

ajax本身有效。检索数据,但它仅显示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)))  

2 个答案:

答案 0 :(得分: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)
            });

答案 1 :(得分: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);