Jquery Ajax发布到Django View
我正在试图找出将后期数据发送到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:
在view函数中,我可以访问如下值:
def do_something(request): if request.POST: name = request.POST.getlist('name')[0] age = request.POST.getlist('age')[0]
这种感觉错误(通过getlist访问post数据然后获取列表中的第一个元素)作为将后期数据从jquery传递到django的方法。 有更好的方式发送数据吗?
这可能是做到这一点的“正确方法”,尽管它并不轻松。
您可以使用[]表示法从HttpRequest对象的POST列表中读取JSON数据,例如:
JSONdata = request.POST['data']
然后解码JSON数据:
dict = simplejson.JSONDecoder().decode( JSONdata )
并且您最终将所有JSON数据放在dict变量中。 用法示例:
username = dict['name']
为什么你需要使用getlist
? Django的QueryDict对象使用所有项目的列表,但是简单的get
– 或者甚至是普通的字典访问 – 总是得到第一个项目。 所以这:
name = request.POST['name']
工作良好。
另外,我不了解你首先构建JS对象的方式。 ""+name
什么意义? 为什么不{name: name, age: age}
?
您可以创建表单并将保存此数据的代码放入.save方法中。 这样您也可以免费获得validation。 如果在视图中执行多次查询以请求.POST和validation,则可能以错误的方式分离了关注点。
如果您只想将此数据保存到模型中,请使用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 })
- Jqueryvalidation – 检查服务器端Django的电子邮件和用户名可用性
- jquery ajax / django – 在bootstrap模式中显示当前表单并重新显示validation是否成功
- jQuery Validation Plugin使用Django远程检查密码
- $ ajax命令和Json响应
- Django ajax HttpResponse json错误意外的令牌d
- 重新加载后无法单击jquery ajax项目
- 如何将焦点设置为django表单元素的CharField
- 无法在Ajax post请求中创建新的Django模型对象
- 创建Django依赖下拉列表不会自动填充第二个下拉列表