2010-12-22 7 views
1

Die Datenvariable gibt nichts zurück, wenn sie "OK" oder "EXISTS" zurückgeben soll.leere Daten vom Ajax-Aufruf

Ich habe eine Vorlage mit einem Overlay-Effekt. Die einkommen.html Vorlage hat ein Formular und eine Schaltfläche "Eine neue Kategorie hinzufügen", wenn Sie darauf klicken, wird ein neues Fenster (Überlagerungseffekt) mit einem winzigen Formular angezeigt.

income.html:

(document).ready(function(){ 
$("#new_cat").live("click", (function() {  
    var cat_name = $("#nc").val(); 
    if (cat_name) { 
     $.get("/cashflow/new_cat/0/", { name: cat_name, account: "{{ account }}" }, 
      function(data){ 
      if (data == "OK") { 
       $("#id_category").val(cat_name); 
      } 
      if (data == "EXISTS") { 
       var error = "The category already exists"; 
       alert(error); 
      } 
      }); 
    } 
    else { 
     var error = "Please enter a name"; 
     alert(error); 
    } 
})) 
}); 
</script> 
... 

<form>{% csrf_token %} 
     <label for="name">Name:</label><input type="text" id="nc" /> 
     <input type="submit" value="Submit" id="new_cat" /> 
</form> 

views.py:

@login_required 
def income(request, account_name): 
    account = account_name 
    if request.method == 'POST': 
     form = TransForm(user=request.user, data=request.POST) 
     if form.is_valid(): 
      income = form.save(commit=False) 
      income.type = 0 
      income.account = Account.objects.get(
          name = account_name, 
          user = request.user) 
      income.name = form.cleaned_data['name'] 
      income.category = form.cleaned_data['category'] 
      income.save() 
      uri = ("/cashflow/account/%s") % str(account_name) 
      return HttpResponseRedirect(uri) 

    else: 
     form = TransForm(user=request.user) 

    context = { 
      'TransForm': form, 
      'type': '0', 
      'account': account, 
    } 
    return render_to_response(
     'cashflow/income.html', 
     context, 
     context_instance = RequestContext(request), 
    ) 

def new_cat(request, type): 
    if request.method == u'GET': 
     GET = request.GET 
     if GET.has_key(u'name'): 
      name = request.GET[u'name'] 
      account = request.GET[u'account'] 
      c = Category.objects.filter(name=name, account=account) 
      if c: 
       s = "EXISTS" 
      else: 
       c = Category(name = name, user = request.user, 
         type = type, account = account) 
       c.save() 
       s = "OK" 

    return HttpResponse(s) 

Edit: Debug-Info

> ../cashflow/views.py(765)new_cat()-><django....xa507b0c> 
-> return HttpResponse(message) 
(Pdb) p message 
'EXISTS' 
(Pdb) n 
> ../site-packages/django/core/handlers/base.py(112)get_response() 
-> if response is None: 
p response.content 
'EXISTS' 
(Pdb) p response.status_code 
200 

Eine seltsame Sache ist, dass, wenn ich zu debuggen, die Overlays zeige beim Debuggen, nicht danach. Deshalb denke ich, dass es ein JS-Fehler ist. Ich habe vergessen zu sagen, dass die Kategorie erstellt und ordnungsgemäß in der Datenbank gespeichert wird.

Antwort

0

Haben Sie Javascript-Fehler überprüft?

Es sieht für mich wie {{ account }} ist account_name in der Ansicht, und wenn der Name alles bedeutet, ist es wahrscheinlich eine Zeichenfolge.

In Ihrer Ajax-Vorlage liefern Sie {{ account }} direkt ohne Anführungszeichen, also sollte es einen Javascript-Fehler für undefined werfen.

Auch in dieser Situation würde ich immer ein wenig mehr in Ihrem Ajax-Aufruf debuggen. Werfen Sie eine pdb.set_trace() ein und sehen Sie, was der Code macht, wenn Sie die Anfrage senden. Wo stirbt es?

Sie können buchstäblich durch den Code gehen, wie es die GET prüft, sucht nach Schlüssel account, ob es jemals macht variable s zu definieren.

+0

Ich habe den Fehler behoben und vergessen, es in der Post zu ändern. Du hast recht, es war ein Javascriptfehler. Ich debugged die Ansicht von der Ajax-Funktion aufgerufen und die gesamte Ansicht ist gut ausgeführt. – mxm

+0

Die Ansicht kann nicht gut funktionieren, wenn sie nichts zurückgibt! Was zeigt ein Browser-Debugger in XHR als Serverantwort an? Keine Fehlermeldung? Bist du sicher, dass du keine Fehlermeldung bekommst, aber ** nichts **? Zum Beispiel wäre CSRF ein Problem mit dieser Ansicht, es sei denn, Sie haben es deaktiviert. –

+0

Der erste Schritt ist herauszufinden, ob dies JS oder Django ist. Führe den Ajax-Anruf aus und erzähle uns, was du in der Ajax-Antwort von einem Browser-Debugger siehst. –