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 ответ

Похоже, последний вариант, сохранение данных формы в базе данных - самый простой и безопасный способ. Функциональность мастера форм иногда отвлекает меня от того, что мне действительно нужно сделать. Поэтому я пытаюсь взглянуть на задачу под другим углом.

Для меня это было бы самым простым решением:

  1. Создайте модель Django для каждой формы.
  2. Создайте модельную форму для каждой соответствующей модели.
  3. Каким-нибудь образом (промежуточное ПО, просмотр...) проверьте, какая модель отсутствует, и перенаправьте пользователя к следующему шагу.
  4. Когда последняя модель заполняется, обрабатывайте по мере необходимости.
  5. Если присутствуют все модели, не перенаправляйте.
Другие вопросы по тегам