Jquery Ajax发布到Django View

时间:2011-10-13 10:58:28

标签: jquery django post

我正在试图找出将后期数据发送到Django View函数的最佳方法。

我目前在jquery代码中的内容是这样的:

var name = 'Joe';
var age = 20;

$.ajax({
    url:"/do_something/",
    type: "POST",
    data: {name: name, age: age},
    success:function(response){},
    complete:function(){},
    error:function (xhr, textStatus, thrownError){
        alert("error doing something");
    }
});

数据在QueryDict对象中到达Django:

<QueryDict: {u'name': [u'Joe'], u'age': [u'20']}>

在view函数中,我可以访问如下值:

def do_something(request):
    if request.POST:
        name = request.POST.getlist('name')[0]
        age = request.POST.getlist('age')[0]

这种感觉错误(通过getlist访问帖子数据然后获取列表中的第一个元素)作为将帖子数据从jquery传递到django的方法。有更好的方法来发送数据吗?

3 个答案:

答案 0 :(得分:5)

这可能是做到这一点的“正确方法”,尽管它并不轻松。

您可以使用[]表示法从HttpRequest对象的POST列表中读取JSON数据,例如:

JSONdata = request.POST['data']

然后解码JSON数据:

dict = simplejson.JSONDecoder().decode( JSONdata ) 

并且您最终将所有JSON数据放在dict变量中。用法示例:

username = dict['name']

答案 1 :(得分:4)

为什么你需要使用getlist? Django的QueryDict对象使用所有项目的列表,但简单的get - 甚至普通的字典访问 - 始终获得第一项。所以这个:

name = request.POST['name']

工作正常。

另外,我不了解你首先构建JS对象的方式。 ""+name有什么意义?为什么不只是{name: name, age: age}

答案 2 :(得分:3)

您可以创建表单并将保存此数据的代码放入.save方法中。这样您也可以免费获得验证。如果您在视图中执行多次查询以请求.POST和验证,则可能会以错误的方式将关注点分开。

如果您只想将此数据保存到模型中,请使用ModelForm类(您可以创建仅包含模型某些字段的表单)。

class PersonForm(forms.Form):
    name = forms.Charfield(max_length=50)
    age = forms.IntegerField(min_value=0, max_value=150)

    def save(self):
        data = self.cleaned_data
        # do what you need here

# protect the view with require_POST decorator
from django.views.decorators.http import require_POST        

@require_POST
def myview(request):
    form = PersonForm(data=request.POST)
    form.save()

表单的另一个好处是,您可以在页面中呈现它,并使用jquery.form.js插件通过ajax提交它,而无需手动推送任何数据:

$('#personform').ajaxForm({
    success: function one,
    error: function two
})