ограничение пользователей от входа в формы - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь реализовать своего рода бизнес-логику c в моем проекте django, из которого только один экземпляр объекта должен быть создан для родительского объекта. Пока что я делаю это, скрывая кнопки в форме создания и показывая другую кнопку обновления, когда транзакция завершается. Однако существует определенный сценарий, который может произойти:

  1. Пользователь A и B находятся на одной странице
  2. Пользователь A переходит в createview
  3. Пользователь A заполняется форма
  4. Страница пользователя B не обновилась, щелкает по кнопке createview
  5. Пользователь A заполняет форму, выходит, кнопка переключается в режим обновления
  6. пользователь B завершает форму, выходит, кнопка переключается в режим обновления
  7. Теперь создается 2 объекта.

Следовательно, мой вопрос, есть ли способ заблокировать createview, когда пользователь находится внутри него?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Ваш сценарий действителен, но вы не должны блокировать это в представлении. Это должно быть частью проверки вашей формы, так как форма должна быть недействительной, если она пытается создать объект, который уже существует.

В вашей форме переопределите метод clean() и вызовите ValidationError, если другой объект с тем же родителем уже существует. Таким образом, вы можете отобразить полезную ошибку для пользователя, например, попросить пользователя обновить sh страницу (которая затем скроет форму). Ваше представление не нуждается в каких-либо изменениях, поскольку оно просто отображает неверную форму с ошибками.

0 голосов
/ 10 февраля 2020

Чтобы ответить на ваш вопрос, да, вы могли бы заблокировать представление, например, посмотрев на этот вопрос stackoverflow: Разрешить отправку формы только один раз в день django

Но вы могли бы Выполните sh вашу цель другим способом, перехватите обработку просмотра обновлений (например, функцию form_valid: https://docs.djangoproject.com/en/3.0/topics/class-based-views/generic-editing/) и проверьте, был ли объект уже создан с этим родительским объектом. Если это так, верните false, и вам не нужна суета с блокировкой и разблокировкой вида.

...