2013-08-24 8 views
2

Я хочу сделать запрос ajax в рамках Django. Однако я не перехожу, чтобы получить данные от клиента в json. Он работает, когда я не использую Json. Если я использую dataType: 'json' с {'a': 'value'} в ajax, я не могу получить его в view.py, результат ничего ... Однако, если я использую данные: $ (this) .serializeArray() в ajax, я могу получить результат с запросом.POST. Тем не менее, мне действительно нужно настроить мои данные и отправить на мои view.py другие данные, чем данные из формы. Я хотел бы отправить {'a', 'mydata', 'form': myformdata} ... Есть ли способ сделать это?Json не работает в Django с Ajax

шаблона:

<form id="ajax2" action="/seghca/test-post/" method="post">{% csrf_token %} 
Nom : <input type="text" name="nom" value="" id="nom"/><br/> 
prenom : <input type="text" name="prenom" value=""/><br/> 
<input type="submit" value="Envoyer"/> 
</form> 


<div id="result"></div> 

JavaScript:

$(document).ready(function(){ 


     // POST AJAX 
     $("#ajax2").submit(function() { 
     var urlSubmit = $(this).attr('action'); 

     var data = $(this).serializeArray(); 
     data.push({ 
       key: "keyName", 
       value: "the value" 
      }); 
     $.ajax({ 
      type: "POST", 
      url: urlSubmit, 
      dataType: "json",    
      data  : data,//$(this).serializeArray(), 
      success: function(response){ 
       var json_response = JSON.parse(response); 
        // now get the variables from the json_response 
        $('#result').html(json_response.html); 
      } 
     }); 
     return false; 
    }); 

    }); 

view.py (на основе AJAX запустить вид test_post, home2 это вид формулярной):

from datetime import datetime 
from django.http import HttpResponse, Http404 
from django.shortcuts import redirect, render 
from seghca.models import Article 


from django.shortcuts import render_to_response 
from django.http import HttpResponse 
from django.template import RequestContext 
from django.views.decorators.csrf import csrf_exempt 
import json 

def home2(request): 
    return render_to_response('seghca/form.html', context_instance=RequestContext(request)) 

@csrf_exempt 
def test_post(request): 
    data = {'html': request.POST['key']} 
    return HttpResponse(json.dumps(data), mimetype="application/json") 
+0

Возможный дубликат [Django Ajax-Jquery не извлекает данные] (http://stackoverflow.com/questions/18397100/django-ajax-jquery-does-not -fetch-the-data) –

ответ

1

Когда вы используете представление ajax, вы должны вернуть данные с вашего вида в форме json:

data = {'html': request.POST['input']} 
return HttpResponse(json.dumps(data), mimetype="application/json") 

Во-вторых, необходимо, чтобы разобрать ответ первого на стороне клиента:

success: function(response){ 
    var json_response = JSON.parse(response); 
    // now get the variables from the json_response 
    $('#result').html(json_response.html); 
} 

В-третьих, если вам нужно передать данные формы наряду с более некоторую информацию вы можете сделать:

var data = $(this).serializeArray(); 
data.push({ 
    key: "keyName", 
    value: "the value" 
}); 

В-четвертых, вам не хватает csrf токен.

+0

Я редактировал свой код с исправлением, однако он не решает проблему, views.py ничего не получил! Кажется, django не хочет получать get json ... – user1731699

+0

Пожалуйста, убедитесь, что вы передаете токен csrf также в сообщениях post. –

+0

Я отредактировал с декоратором (это правильно?), Но он все равно не работает. – user1731699

0

изменение data: data, к data: {'data': JSON.stringify(data)},

, и вы будете иметь возможность получить доступ к сериализованной версии данных с помощью POST['data'] в Джанго. Имейте в виду, что если вы хотите использовать это в django, вам необходимо десериализовать его, например, json.loads(POST['data'])

0

У меня одинаковые потребности. Мое решение было:

Запрос AJAX:

var posturl = $('#'+formid).prop('action'); 

$.ajax({ 
     async:false, 
     type: "POST", 
     dataType: "json", 
     contentType: "application/x-www-form-urlencoded", 
     url : posturl, 
     data : $('#'+formid).serialize() + '&mode=ajax', //&mode=ajax is my custom data 
     success:function(response){    

       console.log(response); 
         alert(response.message); 

     }, 
     timeout:10000 
}); 

В views.py:

 data = {'error': '0', 'message': 'all was ok'} 
     return HttpResponse(json.dumps(data), mimetype="application/json") 

выше должны работать для вас. Мой тест был с Django 1.6 и Python 2.7.5

Смежные вопросы