Estoy creando una aplicación Django simple en la que quiero hacer un análisis cuando el usuario hace clic en el botón en la interfaz.
Tengo una variable de plantilla {{ parsing }} que estoy usando dentro de index.html para deshabilitar el botón de análisis cuando el usuario hace clic en él
<div class="btn-group mr-2" role="group" aria-label="Parsing group"> <button class="btn btn-dark btn-lg" id="parseButton" {% if parsing %} disabled {% endif %}> <i class="fa fa-terminal gradient-text"></i> <span class="gradient-text">| Parse</span> </button> </div>A continuación, lo que hago es el método JQuery que envía una solicitud ajax a mi backend para inicializar las variables para el análisis y el método de views.py devuelve la redirección a la misma página (index.html).
$('#parseButton').click(function () { $.ajax({ type: 'POST', url: 'initialize_parsing/', headers: {"X-CSRFToken": $.cookie("csrftoken")}, data: {} });Entonces mi views.py:
def initialize_before_parsing(request): if request.method == 'POST': frontendTracker = FrontendTracker() frontendTracker.progress = 0 frontendTracker.parsing = True return redirect("index") class IndexView(TemplateView): template_name = 'index.html' def get_context_data(self, **kwargs): frontendTracker = FrontendTracker() context = super(IndexView, self).get_context_data(**kwargs) context["showAnnotation"] = frontendTracker.showAnnotationButton context["parsing"] = frontendTracker.parsing context["progress"] = frontendTracker.progress return contexty urls.py
urlpatterns = [ path('', IndexView.as_view(), name="index"), path("initialize_parsing/", initialize_before_parsing, name="initialize_before_parsing"), ]Finalmente, lo que me molesta es que cuando envío esa solicitud ajax y todo funciona bien cuando mi página está siendo redirigida, la variable de plantilla {{progres}} no cambia ni ninguna otra hasta que actualice. Actualizar con js cuando ajax tiene éxito no es algo que quiera hacer porque tengo otros métodos dentro de js que quiero ejecutar después de esa solicitud de ajax y eso restablecerá mi código js. ¿Cómo se puede lograr cambiar el valor de la variable de análisis sin actualizar?
Tiene estado en 2 lugares: en el navegador y en el servidor.
Cuando carga una página desde el servidor, analiza el estado en el servidor y completa la plantilla en consecuencia. Cuando realiza la llamada AJAX, pasa el estado al servidor, pero no hace nada con el estado de la página en el navegador. En una recarga posterior, verá el cambio reflejado en el navegador porque pasó ese estado a través de la plantilla nuevamente.
No sé mucho sobre FrontendTracker o su problema específico, por lo que no sé cuál es la mejor solución. Una solución es agregar un .done(function( data ) { /* your code */ }) a la llamada $.ajax y luego manipular el contenido de la página para reflejar cómo desea que cambie la página. Sin embargo, parece que tiene algún tipo de valor de progress , por lo que es probable que deba realizar llamadas AJAX posteriores para obtener actualizaciones del servidor para valores actualizados de eso.