Je vais obtenir une requête AJAX sous forme de paramètre dans Django. Voici ce que je fais:
base.html:
main.js:
$(document).ready(function(){ $("#register").live("click", function(e){ $.post("/", { name: "MY TEXT", }); }); });
views.py:
from django.shortcuts import render_to_response from django.template import RequestContext from django.core.context_processors import csrf def home(request): if request.method == 'POST': print request.POST['name'] return render_to_response('registration.html', {}, context_instance=RequestContext(request))
Oui, je sais qu’à ce moment-là, mon JS n’obtient pas de données réelles sous forme de texte, il envoie juste un texte statique “MON TEXTE”. mais quand j’appuie sur le bouton, j’obtiens “MultiValueDictKeyError à /” La clé ‘nom’ est introuvable dans “”
Qu’est-ce que je fais mal?
J’ai changé de code: main.js
$(document).ready(function(){ $("#register").live("click", function(e){ e.preventDefault(); $.post("/", { name:'MY TEXT' }); }); });
base.html:
Ça marche , merci!
Bien que j’ai deux questions:
En réalité, vous n’avez pas empêché l’action d’envoi par défaut du navigateur. Ainsi, votre POST Ajax est terminé, mais le navigateur lui-même POST immédiatement – et, comme le souligne Michal, votre formulaire n’inclut pas de champ de name
. La recherche échoue donc.
Vous devez faire deux choses pour résoudre ce problème. Tout d’abord, utilisez e.preventDefault();
dans votre méthode de clic JS. Deuxièmement, recherchez request.is_ajax()
en haut de votre écran.
Empêcher le formulaire de soumettre avec “e.preventDefault ()”. En outre, il est probablement préférable de se lier au formulaire uniquement si l’utilisateur appuie sur Entrée au lieu de cliquer sur:
base.html
main.js
$(document).ready(function(){ $("#register").live("submit", function(e){ $.post("/", { name: "MY TEXT", }); e.preventDefault(); }); });
Je suppose que le problème est que vous n’avez pas nommé l’entrée de texte dans HTML:
Je pense que ça devrait être
$.post("../save_note/", { data:'name=MY TEXT' });
Et
if 'name' in request.POST:
Au lieu d’utiliser un gestionnaire de clic, vous pouvez configurer une fonction de soumission de formulaire plus robuste pour faire la même chose. Renvoyer false annule le comportement d’envoi par défaut.
$("form").submit(function() { $.post("/", { name: "MY TEXT", }); return false; });