2010-11-30 5 views
1

Modifier: Le problème a été résolu, maintenant j'ai un autre problème. La variable de données ne renvoie rien quand elle devrait retourner "OK" ou "EXISTS".Impossible de créer un objet à partir d'une vue Ajax

J'ai un modèle avec un effet de superposition. Le modèle income.html a un formulaire et un bouton "Ajouter une nouvelle catégorie", lorsque vous cliquez dessus une nouvelle fenêtre est affichée (effet de superposition) avec un minuscule formulaire. Je ne sais pas pourquoi, mais la catégorie ne se crée pas. Il semble que j'ai des erreurs dans le script html mais je ne peux pas les identifier.

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, tipo): 
    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(namee=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) 
+0

Si vous pouvez poster une démo reproduisant le problème qui serait une aide; Je suggérerais [JS Fiddle] (http://jsfiddle.net/) ou [JS Bin] (http://jsbin.com/). –

Répondre

1

Dans la vue new_cat (je pense que tipo est égal au type).

A côté de cela, je pense que l'erreur est ici:

account = request.GET[u'account'] 
c = Category.objects.filter(name=name, account=account) 

compte est une chaîne unicode, mais vous avez besoin d'une instance de compte pour filtrer les catégories. Quelque chose comme ceci devrait fonctionner bien:

account_st = request.GET[u'account'] 
account = Account.objects.get(name=account_st) 
c = Category.objects.filter(name=name, account=account) 
2

Cela ressemble un peu louches:

{ name: cat_name, account: {{ account }} } 

Rappelez-vous que cela est rendu dans un bloc Javascript. cat_name est une variable JS, elle sera donc évaluée correctement. Mais {{ account }} rend à la chaîne, donc en ce qui concerne le JS c'est un littéral. Il doit donc être entre guillemets:

{ name: cat_name, account: "{{ account }}" } 
Questions connexes