Tengo una aplicación Django. Estoy escribiendo un comentario en un formulario y lo estoy enviando a mi base de datos a través de búsqueda.
mi codigo js
document.getElementById("comment-form").onsubmit = function write_comment(e) { e.preventDefault(); const sxolio = document.getElementsByName("say")[0].value; fetch('/comment', { method: 'POST', body: JSON.stringify({ say: sxolio }) }) .then(response => response.json()) .then(result => { //print result console.log(result); });mis vistas.py
@requires_csrf_token @login_required(login_url = 'login')#redirect when user is not logged in def comment(request): if request.method != 'POST': return JsonResponse({"error": "POST request required."}, status=400) new_comment = json.loads(request.body) say = new_comment.get("say", "") user = request.user comment = Comment( user = user, say = say, photo = Userimg.objects.get(user = user).image ) comment.save() return JsonResponse({"message": "Comment posted."}, status=201)Lo siguiente que quiero hacer es mostrar este comentario y todos los demás datos de mi base de datos en mi página html sin actualizar. En el momento en que presione el botón de publicación, quiero que se muestre el comentario. No quiero actualizar la página con algún elemento.innerHTML = datos.
mi codigo js
function display_comments() { fetch('/all_comments') .then(response => response.json()) .then(all_comments => { do some stuffmis vistas.py
@login_required(login_url = 'login')#redirect when user is not logged in def all_comments(request): all_comments = Comment.objects.order_by("-date").all() print(all_comments[0].serialize()) return JsonResponse([comment.serialize() for comment in all_comments], safe=False)Si uso preventDefault, puedo ver que mi base de datos se actualizó pero no puedo recuperar los datos. Si omito la prevención predeterminada, todo funciona bien, pero mi página se actualiza simultáneamente. ¿Hay alguna forma de hacerlos ambos sin actualizar la página?
El problema más probable es que su solicitud de vista all_comments se realice antes de que el comment haya terminado de guardarse en la base de datos.
Es importante que la respuesta para el comment se devuelva por completo antes de que se all_comments la obtención de todos los comentarios. Puedes lograr esto haciendo lo siguiente...
function display_comments() { fetch('/all_comments') .then(response => response.json()) .then(all_comments => { console.log(all_comments); }); } document.getElementById("comment-form").onsubmit = function write_comment(e) { e.preventDefault(); const sxolio = document.getElementsByName("say")[0].value; fetch('/comment', { method: 'POST', body: JSON.stringify({ say: sxolio }) }) .then(response => response.json()) .then(result => { // print result console.log(result); // The request to /comment has finished it is now safe to request all // comments. display_comments(); }); }