2012-12-03 31 views
5

Sono un principiante sia per Ajax che per Django. Per semplificare la domanda presumo di avere un modulo nascosto e due oggetti, e chiedo agli utenti di fare clic su parte della posizione degli oggetti. Ogni clic riempie una parte del modulo. Voglio che il modulo sia compilato una volta per ogni oggetto. quindi due volte in generale. Quando il modulo è compilato per il primo oggetto, desidero inviare il modulo tramite Ajax al server, senza aggiornare la pagina e consentire al modulo di essere ricaricato per il secondo oggetto. Tuttavia, per qualche motivo non riesco a far inviare il modulo tramite ajax.Modulo AJAX e DJANGO

Ecco il mio codice: index.html:

<html> 
<body> 
<script src="{{ STATIC_URL }}prototype.js"></script> 
<script src="{{ STATIC_URL }}jquery.js"></script> 
<script> 

    objectID= 1; 
    num_obj = {{num_obj}} 

    function ajax_post(){ 
    $('#inputform').submit(function() { 
     $.ajax({ 
      type: 'POST', 
      url: '/index/', 
      data: $(this).serialize(), 
      success: function(data){alert(data)} 

     }); // end new Ajax.Request 
    }); 
    } 


function onDocumentMouseDown(event) { 
     ....do stuff 
     if (objectID < num_obj){ 
      ajax_post() 
      } 
     if (objectID == num_obj){ 
      $("form").submit();} 
     objectID ++; 
     $("form").clearForm(); 
     document.forms[0].ObjectID.value = objectID; 
     } 
    </script> 
    <form action="" method="post" id="inputform"> 
     <div id="ajaxwrapper"> 
     {% csrf_token %} 
     <table> 
     {{ form.as_table }} 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

mia view.py:

from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import * 
from firstapp.forms import PracForm3 

num_obj=2 

def index(request): 
    Obj.objects.all().delete() 
    if request.method == 'POST': 
    form = PracForm3(request.POST) 
    print "\n\n\n\n\n" 
    if request.is_ajax(): 
     print "yaaaaay AJAX" 
     print request.POST 
    else: 
     print "noooooo" 
    print "\n\n\n\n\n" 
    if form.is_valid(): 
     cd = form.cleaned_data 
     ..... 
     if cd['ObjectID'] == num_obj: 
     return HttpResponseRedirect('/submit') 
    else: 
    form = PracForm3() 
    dic = {'form': form, 'num_obj': num_obj, ...} 
    return render_to_response('index.html', dic, context_instance=RequestContext(request)) 

mia urls.py:

from django.conf.urls import patterns, include, url 
from firstapp.views import index, submit 
from django.conf import settings 

urlpatterns = patterns('', 
('^index$', index), 
('^submit$', submit), 
) 

per qualche ragione, il mio Ajax non funziona nessuno sa cosa sto sbagliando?

+0

Potete fornire maggiori dettagli in merito? Puoi utilizzare la console per gli sviluppatori di un browser (ti consiglio Chrome) e incollare eventuali errori o richieste che vedi. –

+0

Non vedo errori o richieste. Non sono sicuro che l'ajax pubblichi nulla – user1871528

+0

Stai tenendo conto di CSRF? – esse

risposta

0

Si sta richiedendo /index/ nella chiamata ajax, ma il modello corrisponde a /index.

+0

Ho cambiato l'url: '/ index /' in url: '/ index' non funziona ancora – user1871528

3

Questo è probabilmente correlato CSRF per i post AJAX, è necessario ricordare di passare il token CSRF come dati POST ad ogni richiesta POST. Potrebbe essere necessario aggiungere questo codice here, che sono i documenti Django che parlano di Django + CSRF + AJAX.

ho notato nella vista Django che si reindirizzano a "presentare" In genere con l'Ajax non vorrei reindirizzare a un URL diverso, vorrei usare un HttpResponse e restituire un valore stringa, ad esempio JSON. Inoltre, non so perché hai delle istruzioni di stampa nella tua vista, a meno che tu non stia immergendo in quella vista in un debugger. Per test/debug devi avere una variabile a cui assegni una stringa, e poi passarla di nuovo a ajax. Poi nella tua ajax puoi leggere il messaggio dalla vista, qualcosa come questo.

def index(request): 
    ... 
    if request.is_ajax(): 
     msg = 'it worked' 
    else: 
     msg = 'i am sad' 
    return HttpResponse(msg) 
    ... 

Inoltre è javascript dovrebbe avere una funzione di errore di successo e nella chiamata ajax, è solo avere successo in modo che non stanno recuperando gli errori, data la tad vista bit Javascript sarebbe simile a questa:

... 
success: function(data){alert(data)}, 

error: function(data){alert(data)} 
...   

Sembra che tu possa avere diversi problemi in corso. Se non hai fatto il materiale CSRF che ti ho dato il link a questo è un problema, per test usa il csrf_exempt se non vuoi indirizzarti nel modo preferito. Prova i bit di codice sopra e vedi se questo fa progressi per te.

0

Potrebbe essere causato dal csrf, aggiungere @csrf_exempt prima che il nome del metodo sia utile.

@csrf_exempt 
def method(args): 
    pass 
+0

Ciò non ha aiutato. – user1871528

0

Ho commentato il CSRF quindi non era che la mia funzione Ajax fosse il problema. Ecco il modo corretto:

function ajax_post(){ 
    $.ajax({ 
     type: 'POST', 
     url: '/index/', 
     data: $(this).serialize(), 
     success: function(data){alert(data)} 

    }); // end new Ajax.Request 
} 

grazie per tutto il vostro input

1

il token CSRF è incluso nel $('#input-form') richiesta POST, quindi non credo che era il problema. Penso che il problema sia che non stai convertendo il contesto in json nella tua vista.Questo è dal docs example:

import json 
from django.http import HttpResponse 

class JSONResponseMixin(object): 
    """ 
    A mixin that can be used to render a JSON response. 
    """ 
    response_class = HttpResponse 

    def render_to_response(self, context, **response_kwargs): 
     """ 
     Returns a JSON response, transforming 'context' to make the payload. 
     """ 
     response_kwargs['content_type'] = 'application/json' 
     return self.response_class(
      self.convert_context_to_json(context), 
      **response_kwargs 
     ) 

    def convert_context_to_json(self, context): 
     "Convert the context dictionary into a JSON object" 
     # Note: This is *EXTREMELY* naive; in reality, you'll need 
     # to do much more complex handling to ensure that arbitrary 
     # objects -- such as Django model instances or querysets 
     # -- can be serialized as JSON. 
     return json.dumps(context)