Django - Предотвращение двойного выполнения команды администратора
Моя проблема проста, у меня есть команда администратора с именем "send email":
Проблема в том, что пользователю-администратору удается вызвать эту функцию дважды подряд. Вероятно, при нажатии на кнопку "Go" много раз. Таким образом, он отправляет электронное письмо много раз. Есть ли способ предотвратить это?
Я пытался поставить таймаут в конце функции администратора "send_email", но это не помогает... Это занимает 10 секунд между каждым пользователем, а у меня много пользователей.
def send_email(modeladmin, request, queryset):
...
time.sleep(10)
Вы можете использовать JavaScript для предотвращения двойного нажатия на кнопку.
Чтобы добавить javascript в админку, вы можете переопределить HTML шаблоны админки или добавить javascript, используя этот подход
const button = document.querySelector("#my-go-button");
let didIClickGo = false;
button.addEventListener("click", (event) => {
if (!didIClickGo) {
didIClickGo = true;
} else {
event.preventDefault();
}
});
Примечание: в строке 1 наведите селектор на вашу кнопку.
Другим вариантом может быть ограничение скорости на бэкенде, где вы сохраняете данные об электронных письмах и каждый раз, когда вы вызываете функцию, вы должны проверить, отправляли ли вы письмо этому пользователю за последние пару секунд, возможно.
Вы можете проверить, отличается ли набор запросов от предыдущего раза, чтобы избежать вызова send_email
дважды подряд:
old_queryset = None
def send_email(modeladmin, request, queryset):
if self.old_queryset != queryset:
self.old_queryset = queryset
... # Inserts your code here in the "if" block
Вы должны определить old_queryset
как свойство подкласса ModelAdmin
.