将查询字符串反序列化为querydict(由AJAX发送)

时间:2017-08-27 13:06:03

标签: ajax django

也许这是我自己序列化不好的问题,但是我的数据反序列化有问题:

我通过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, ...

1 个答案:

答案 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>

希望这会有所帮助。感谢。