也许这是我自己序列化不好的问题,但是我的数据反序列化有问题:
我通过AJAX(通过POST)将一个Modelform发送到视图。没有错误,但保存的ModelForm在我的模型中创建了一个空项目。
我已经检查了request.POST
的调试器:有一个密钥对应于AJAX发送的内容,但它不是一个QueryDict,而是一个表格的字符串:
request.POST['keyinrequestpost'] = 'csrfmiddlewaretoken=pA.....zutQ&FirstField=BlaBlad&SecondField=BlaBla&ThirdField=BlaBla'
显然,那样做:
MyModelForm(request.POST['keyinrequestpost'])
不起作用(创建的项只有空字段),因为它不是QueryDict? 我以为转换是自动的?
如何反序列化以使MyModelForm()可以使用QueryDict?
我的AJAX:
$(document).ready(function(){
$('#newword_form').bind('submit', function(e){
var newword_form = $('#newword_form')
newword_form_serialized = newword_form.serialize();
$.ajax({url: '/create_newword/',
type: 'POST',
dataType: 'json',
data:{csrfmiddlewaretoken: '{{ csrf_token }}',
'newword': newword_form_serialized } ,
success: function(data){
...
和我的观点:
if 'newword' in request.POST.keys(): # the form has been posted
f = MyModelForm(request.POST['newword'])
if f.is_valid():
word = f.save()
return render(request, ...
答案 0 :(得分:1)
您无需以这种方式发送csrf_token
。如果它在你的表格内; 那就是,然后您可以简单地序列化表单并将其发送到数据中。
序列化后, csrf令牌和所有表单数据将包含在字典中并发送到服务器。然后,您只需在视图中访问它即可。
试试这个(JavaScript):
//var url = your url;
$.ajax({
url : url,
type : 'POST',
dataType: 'json',
data: $('form#newword_form').serialize(),
success : function(data, status, xhr){
//success
},
error : function(data , status , xhr){
//error
}
});
然后在你的views.py:
f = MyModelForm(request.POST)
工作得很好。
告诉我它是否没有。
补充说明:我希望您的HTML看起来有点像这样:
<form method="post">
{% csrf_token %}
<h4>Form Title</h4>
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
希望这会有所帮助。感谢。