2017-05-01 1 views
1

Je veux afficher les commentaires des utilisateurs, juste après les avoir publiés.J'ai déjà fait l'ajax télécharger le commentaire, comment puis-je l'afficher à l'utilisateur, sans actualiser? J'ai ce code ajax:Afficher les commentaires sans actualiser

$(".comments input[name='post']").keydown(function (evt) { 
    var keyCode = evt.which?evt.which:evt.keyCode; 
    if (keyCode == 13) { 
     var form = $(this).closest("form"); 
     var container = $(this).closest(".comments"); 
     var input = $(this); 
     $.ajax({ 
     url: "{% url 'comment' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}", 
     data: $(form).serialize(), 
     type: 'post', 
     cache: false, 
     beforeSend: function() { 
      $(input).val(""); 
      $(input).blur(); 
     }, 
     success: function (data) { 
      alert("Successful comment"); 
      $(input).val(""); 
      $(input).blur(); 
     } 
     }); 
    } 
    }); 

Ceci publie le commentaire. Dans views.py i sauvegarder commentaire:

def comment(request, letnik_id, classes_id, subject_id): 
try: 
    if request.method == 'POST': 
     exam_id = request.POST.get('exam_id') 
     exam = get_object_or_404(Exam, id=exam_id) 
     comment = request.POST.get('post') 
     comment = comment.strip() 
     if len(comment) > 0: 
      instance = ExamComment(
       exam=exam, 
       comment=comment, 
       comment_user=request.user) 
      instance.save() 
      return redirect('subject_id', letnik_id=letnik_id, classes_id=classes_id, subject_id=subject_id) 
     html = '' 
     for comment in exam.get_comments(): 
      html = '{0}{1}'.format(html, render_to_string('exam_partial_comment.html', {'comment': comment})) 
     return HttpResponse(html) 
    else: 
     return HttpResponseBadRequest() 
except Exception: 
    return HttpResponseBadRequest() 

aussi sans: return redirect('subject_id', letnik_id=letnik_id, classes_id=classes_id, subject_id=subject_id) ce code, je recevrais error400 et je alerte obtenir fréquenté pas le succès ...

Répondre

1

D'abord, vous devez JsonResponse fonction au lieu de HttpResponse . Avec JsonResponse, vous passez juste un objet dictionnaire avec les commentaires que vous souhaitez mettre à jour dans votre page, quelque chose comme:

from django.http import JsonResponse 
if request.method == 'POST': 
    #... 
    if len(comment) > 0: 
     #...saving... 
    comments = ExamComment.objects.filter(exams=exams, comment_user=request.user) 
    newcomments = {comments:[]} 
    for comment in comments: 
     newcomments[comments].append(comment) 
    return JsonResponse(newcomments) 
else: 
    return HttpResponseBadRequest() 

De cette façon, il n'y a pas rendu impliqué et vous revenez nouveaux (et anciens) commentaires à votre modèle . Ensuite, vous devez reconstruire votre commentaire div (que je ne connais pas le nom) après le succès ajax:

success: function (data) { 
     alert("Successful comment"); 
     $(input).val(""); 
     $(input).blur(); 
     var div = document.getElementById('yourCommentDivName'); 
     newcomments = '' 
     for(i;i<data.comments.length;i++){ 
     newcomments = newcomments + '<p>' + data.comments[i] + '</p>' 
     } 
     div.innerHTML = div.innerHTML + newcomments; 
    } 

Eh bien, c'est ça. Commentaires: le code n'est pas testé; Si vous faites ce genre de choses beaucoup, vous devriez regarder dans certaines bibliothèques javascript qui le fait hors de la boîte, comme réagir. Courbe d'apprentissage raide, mais une fois que vous comprenez c'est un épargnant de vie; La dernière chose est, bien, évitez cet essai sauf des trucs. Cela rend le débogage plus difficile, et est mauvais pour votre santé à long terme. Ne faites cela que si vous devez vraiment le faire, ce que je ne pense pas être le cas.

J'espère que ça aide!

+0

puis-je afficher uniquement le nouveau commentaire, pas tous ensemble, car tous les autres seraient déjà rendus? – zzbil

+0

Bien sûr! Au lieu d'interroger tous les commentaires de la vue, envoyez simplement le nouveau commentaire dans JsonResponse dans un dictionnaire, comme JsonResponse ({comment: comment}). Sur la fonction de succès ajax, déposez la boucle for et ajoutez simplement le nouveau commentaire comme div.innerHTML = div.innerHTML + comment; Oui, beaucoup mieux de cette façon. – Tico

+0

Merci beaucoup. Mais il y a un problème. Si je descends ceci: return redirect ('subject_id', letnik_id = letnik_id, classes_id = classes_id, subject_id = subject_id) dans la vue, je n'ai pas de succès dans ajax. Savez-vous pourquoi? J'obtiens l'erreur 400 (mauvaise demande), mais après l'actualisation le commentaire est posté – zzbil