Tengo un formulario dentro de un modal que uso para editar una reseña sobre un artículo (un perfume). Un perfume puede tener múltiples reseñas, y las reseñas viven en una serie de documentos anidados, cada uno con su propio _id.
Estoy editando cada reseña en particular (en caso de que un usuario quiera editar su reseña sobre el perfume una vez que se haya enviado) enviando el EditReviewForm a esta ruta edit_review :
@reviews.route("/review", methods=["GET", "POST"]) @login_required def edit_review(): form = EditReviewForm() review_id = request.form.get("review_id") perfume_id = request.form.get("perfume_id") if form.validate_on_submit(): mongo.db.perfumes.update( {"_id": ObjectId(perfume_id), <I edit my review here> }) return redirect(url_for("perfumes.perfume", perfume_id=perfume_id)) return redirect(url_for("perfumes.perfume", perfume_id=perfume_id))Y esta ruta redirige a mi ruta de perfumes, que muestra el perfume y todas las reseñas que contiene.
Esta es la ruta del perfume :
@perfumes.route("/perfume/<perfume_id>", methods=["GET"]) def perfume(perfume_id): current_perfume = mongo.db.perfumes.find_one({"_id": ObjectId(perfume_id)}) add_review_form = AddReviewForm() edit_review_form = EditReviewForm() cur = mongo.db.perfumes.aggregate(etc) edit_review_form.review.data = current_perfume['reviews'][0]['review_content'] return render_template( "pages/perfume.html", title="Perfumes", cursor=cur, perfume=current_perfume, add_review_form=add_review_form, edit_review_form=edit_review_form )Mi problema
Para encontrar una manera de obtener el review _id en ese proceso y tenerlo en mi ruta de perfume , para poder completar previamente mi EditReviewForm con el valor actual. De lo contrario, el formulario parece vacío para el usuario que edita su reseña.
Codificando un índice (índice [0] en este caso):
edit_review_form.review.data = current_perfume['reviews'][0]['review_content']De hecho, estoy mostrando los valores actuales, pero, por supuesto, el mismo valor para todas las revisiones, ya que las revisiones están en un bucle en la plantilla, y necesito obtener el valor que tiene cada review_id.
¿Hay alguna manera de hacer esto, antes de renunciar a la idea de permitir que los usuarios editen sus reseñas? :D
Por favor, hágame saber si mi pregunta es clara o si se necesita más información.
¡¡Muchas gracias de antemano!!
ACTUALIZACIÓN 2:
Intentando reducir aún más la situación actual de mi plantilla para que quede más claro:
El modal con la reseña se dispara desde perfume-reviews.html , desde este botón:
<div class="card-header"> <button type="button" class="btn edit-review" data-perfume_id="{{perfume['_id']}}" data-review_id="{{review['_id']}}" data-toggle="modal" data-target="#editReviewPerfumeModal" id="editFormButton">Edit</button> </div> Y eso abre el modal donde está mi formulario con la revisión (el campo en cuestión es un área de texto que actualmente muestra un WYSIWYG de textarea :
<div class="modal-body"> <form method=POST action="{{ url_for('reviews.edit_review') }}" id="form-edit-review"> <div class="form-group" id="reviewContent"> {{ edit_review_form.review(class="form-control ckeditor", placeholder="Review")}} </div> </form> </div>Actualmente esto no está funcionando:
$(document).on("click", "#editFormButton", function (e) { var reviewText = $(this) .parents(div.card.container) .siblings("div#reviewContent") .children() .text(); $("input#editReviewContent").val(reviewText); }); y lanza un ReferenceError: div is not defined .
¿Dónde estoy fallando aquí? (¿Quizás en más de un lugar?)
ACTUALIZACIÓN 3:
aquí es donde el botón abre el modal, y debajo es donde se muestra el contenido de la revisión:
<div class="card container"> <div class="row"> <div class="card-header col-9"> <h5>{{review['reviewer'] }} said on {{ review.date_reviewed.strftime('%d-%m-%Y') }}</h5> </div> <div class="card-header col-3"> <button type="button" class="btn btn-success btn-sm mt-2 edit-review float-right ml-2" data-perfume_id="{{perfume['_id']}}" data-review_id="{{review['_id']}}" data-toggle="modal" data-target="#editReviewPerfumeModal" id="editFormButton">Edit</button> </div> </div> <div class="p-3 row"> <div class=" col-10" id="reviewContent"> <li>{{ review['review_content'] | safe }}</li> </div> </div> </div>Puede hacer esto con jQuery ya que cuando abre el formulario, el formulario mostrará automáticamente el contenido de la revisión allí. Se hará manipulando el dom.
Además, agregue una identificación a su botón de edición, en este ejemplo, le he dado una identificación "editFormButton".
Del mismo modo, agregue una identificación al div en el que se encuentra el contenido de la revisión para que sea más fácil de seleccionar, le he dado una identificación "reviewContent"
Del mismo modo, agregue una identificación a edit_review_form.review como esta edit_review_form.review(id='editReviewContent')
<script> $(document).on("click", "#editFormButton", function (e) { var reviewText = $(this) .parents("div.row") .siblings("div.p-3.row") .children("div#reviewContent") .children() .text(); $("input#editReviewContent").val(reviewText); }); </script>No olvides incluir jQuery.
Además, puedes hacerlo con javascript puro. Puede buscar fácilmente los equivalentes anteriores en Google. ¡Este artículo es un buen comienzo!