【问题标题】:Jquery Ajax Post to Django ViewJquery Ajax 发布到 Django 视图
【发布时间】:2011-12-06 20:58:00
【问题描述】:

我正在尝试找出将发布数据发送到 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']}>

在视图函数中,我可以像这样访问值:

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

作为将帖子数据从 jquery 传递到 django 的一种方式,这在某种程度上感觉是错误的(通过 getlist 访问帖子数据,然后获取列表中的第一个元素)。有没有更好的数据发送方式?

【问题讨论】:

  • 如何让视图 do_something 被调用?我正在做类似的事情,但是在调用 do_something 时它没有到达 urls.py。我一直在寻找。

标签: jquery django post


【解决方案1】:

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

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

JSONdata = request.POST['data']

然后解码 JSON 数据:

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

您最终将所有 JSON 数据都保存在 dict 变量中。示例用法:

username = dict['name']

【讨论】:

    【解决方案2】:

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

    name = request.POST['name']
    

    工作正常。

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

    【讨论】:

    • 到你的第一点 - 不,它没有。你的第二点 - 很公平。我已经删除了“”+。
    • 你是什么意思,“不,它没有”?会发生什么?
    【解决方案3】:

    您可以创建一个表单并将保存此数据的代码放入 .save 方法中。这样您还可以免费获得验证。如果您在一个视图中对 request.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
    })
    

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 2020-05-21
      • 2013-11-04
      • 2013-08-14
      • 2015-10-16
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多