Django - Предотвращение двойного выполнения команды администратора

Моя проблема проста, у меня есть команда администратора с именем "send email": enter image description here

Проблема в том, что пользователю-администратору удается вызвать эту функцию дважды подряд. Вероятно, при нажатии на кнопку "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.

Вернуться на верх