Django formtools, как хранить данные формы между циклами выхода / входа в систему
Я использую django-formtools для разделения длинной формы на части. Это нормально работает. Однако я хочу, чтобы пользователи могли начинать заполнять форму, пока, скажем, не шаг 5 из 9, затем выйдите из системы, войдите снова и продолжите заполнение формы, начиная с шага 5.
Я могу сделать это с помощью файлов cookie, но если пользователь A начинает заполнять форму, затем выходит из системы, а затем пользователь B входит в систему, пользователь B может видеть данные пользователя A, если пользователь B решает продолжить заполнение формы. Это происходит, если пользователи A и B используют один и тот же компьютер и веб-браузер. Этого, конечно, не может быть.
Если я использую сеансы вместо файлов cookie, тогда, когда пользователь выходит из системы, невозможно продолжить заполнение формы с шага 5, поскольку сеанс очищается и данные удаляются. Так что я думаю, что сеансы мне здесь не помогут.
Чтобы продолжить заполнение формы с шага 5, я переопределяю метод get для django-formtools.WizardView
:
def get(self, request, *args, **kwargs):
""" To allow resume editing of a session storaged submissions """
if self.continue_fill == True:
try:
return self.render(self.get_form())
except Exception as e:
print(e)
return super().get(request, *args, **kwargs)
else:
return super().get(request, *args, **kwargs)
#---
self.continue_fill
установлен в urls.py
как:
urlpatterns = [
path(
'new/',
views.SubmissionsWizardView.as_view(),
name='submission_new'
),
path(
'resume/',
views.SubmissionsWizardView.as_view(continue_fill=True),
name='submission_resume',
),
]
Итак, мои вопросы:
1.- Можно ли связать файлы cookie с одним пользователем в Django?
2.- В моем случае пользователи A и B могут видеть свои данные, потому что я использую один и тот же компьютер, тот же веб-браузер и один и тот же пользователь входа на ПК, потому что я все еще разрабатываю сайт. Но в целом, будет ли файл cookie для пользователя A, использующего учетную запись пользователя A на ПК, отличаться от файла cookie для пользователя B, использующего учетную запись пользователя B на том же ПК и, конечно, с использованием того же веб-браузера? Как вообще файлы cookie разделяются для разных пользователей в веб-браузере?
3.- Есть ли возможность сделать эту работу (выход из системы / продолжение заполнения входа в систему) с помощью сессий?
4.- Что, если я хочу разрешить пользователям иметь несколько экземпляров формы на разных этапах заполнения? Поддерживает ли это django-formtools?
5.- Думаю, я мог бы создать таблицу для временного хранения данных в форме и связать строку с пользователем, а затем обновить строку для каждого шага в форме или переопределить метод выхода, чтобы убедиться, что данные cookie/ сеанса хранится в БД. Это позволило бы иметь несколько сохраненных форм, которые пользователь мог бы продолжить редактировать, но это большая работа. Есть более простая альтернатива?
1 ответ
Похоже, последний вариант, сохранение данных формы в базе данных - самый простой и безопасный способ. Функциональность мастера форм иногда отвлекает меня от того, что мне действительно нужно сделать. Поэтому я пытаюсь взглянуть на задачу под другим углом.
Для меня это было бы самым простым решением:
- Создайте модель Django для каждой формы.
- Создайте модельную форму для каждой соответствующей модели.
- Каким-нибудь образом (промежуточное ПО, просмотр...) проверьте, какая модель отсутствует, и перенаправьте пользователя к следующему шагу.
- Когда последняя модель заполняется, обрабатывайте по мере необходимости.
- Если присутствуют все модели, не перенаправляйте.