Отключите кнопку до выполнения задачи Celery по требованию
Продолжение вопроса к моей предыдущей проблеме.
У меня есть кнопка в шаблоне Django, которая запускает задачу Celery. Я хочу отключить кнопку после нажатия на нее. Это ресурсоемкая задача, и определенно необходимо предотвратить многократное нажатие.
Моя первоначальная идея состояла в том, чтобы иметь две кнопки, и условно показывать одну или другую, в зависимости от того, запущена задача или нет. Я бы как-то (еще не придумал как), используя AsyncResult(str(task)).status = "SUCCESS"
, передал полученный булеан в шаблон. Затем показать отключенную кнопку, если False
, в противном случае исходную кнопку с возможностью клика.
template.html
{% if importEnabled == True %}
<a class="btn btn-primary btn--full" id="id_import_data_btn" href="
{% url "import_data" company.company_id %}">Import Data</a>
{% else %}
<a class="btn btn-primary btn--full" disabled="True">Importing Data (button disabled)...</a>
views.py
def trigger_import_data(request, company_id):
task = import_data_for_company.delay(company_id)
importEnabled = AsyncResult(str(task)).status == "SUCCESS"
return HttpResponseRedirect(reverse_lazy("edit-company-profile"))
Моя вторая идея заключалась в использовании JS в шаблоне и отключении кнопки после нажатия на нее. Здесь я мог сделать так, чтобы кнопка не функционировала (но не отключалась) после щелчка, но это также не вызывало задачу celery, что плохо.
Затем я попробовал установить булево значение для хранения сессии, чтобы определить отображение кнопки в шаблоне. Но, похоже, Django не делает хранение сессий.
utils.js
export const disableImportButton = () => {
const importButton = document.getElementById("id_import_data_btn");
importButton.onclick = (e) => {
// importButton.disabled = true;
// setTimeout(importButton.removeAttribute("href"), 5000);
// e.preventDefault();
sessionStorage.setItem("importEnabled", "false");
};
};
Как я могу решить эту проблему?