Шаблонные переменные не обновляются после перенаправления в Django?
Я создаю простое приложение на django, где я хочу сделать некоторый парсинг, когда пользователь нажимает кнопку на фронтенде.
У меня есть переменная шаблона {{ parsing }}, которую я использую внутри index.html для отключения кнопки парсинга, когда пользователь нажимает на нее
<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>
Далее я делаю метод JQuery, который отправляет ajax запрос на мой бэкенд для инициализации переменных для парсинга, а метод из views.py возвращает перенаправление на ту же страницу (index.html).
$('#parseButton').click(function () {
$.ajax({
type: 'POST',
url: 'initialize_parsing/',
headers: {"X-CSRFToken": $.cookie("csrftoken")},
data: {}
});
Тогда мой 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 context
и urls.py
urlpatterns = [
path('', IndexView.as_view(), name="index"),
path("initialize_parsing/", initialize_before_parsing, name="initialize_before_parsing"),
]
Наконец, меня беспокоит то, что когда я отправляю этот ajax запрос и все работает нормально, когда моя страница перенаправляется {{progres}} переменная шаблона не изменяется или любая другая, пока я не сделаю refresh. Делать refresh с js, когда ajax успешен, это не то, что я хочу делать, потому что у меня есть некоторые другие методы внутри js, которые я хочу выполнить после этого ajax запроса, и это сбросит мой js код. Как можно добиться изменения значения переменной парсинга без обновления?
У вас есть состояние в двух местах: в браузере и на сервере.
Когда вы загружаете страницу с сервера, она анализирует состояние на сервере и заполняет шаблон соответствующим образом. Когда вы делаете вызов AJAX, вы передаете состояние на сервер, но ничего не делаете с состоянием страницы в браузере. При последующей перезагрузке вы видите отраженное изменение в браузере, потому что вы снова передали это состояние через шаблон.
Я не слишком много знаю о FrontendTracker
и вашей конкретной проблеме, поэтому не знаю лучшего решения. Одно из решений - добавить обработчик .done(function( data ) { /* your code */ })
к вызову $.ajax
и затем манипулировать содержимым страницы, чтобы отразить, как вы хотите, чтобы страница изменилась. Однако, похоже, что у вас есть какое-то значение progress
, поэтому вам, вероятно, придется делать последующие вызовы AJAX для получения обновлений от сервера для обновленных значений этого значения.