Многостраничная форма Django с несколькими моделями и представлениями - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю над существующей системой, в которой есть несколько форм, которые заполняют группу моделей в Django, но они связаны друг с другом и разделены по некоторым компонентам вкладки для заполнения.

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

Каждая форма после заполнения сохраняет в базе данных эту часть по отдельности, и это хорошо, потому что у пользователя может не быть всей информации сразу, но мне нужен способ оповещения:

  • Если пользователь не заполнил все формы, чтобы сообщить ему, что он не будет проверен администратором, пока он не сделает это.
  • Флаг, позволяющий администратору знать, что пользователь еще не завершил все, и не тратить на это время.

Я пытался создать пользовательскую функцию save для моделей, которая сохраняла бы флаг на основе, если бы некоторые значения были not None, но поскольку существует много внешних связей, и некоторые модели заполнены более чем на одной странице это может быть трудно.

Еще одна вещь, которую я сейчас пытаюсь получить, - это получить экземпляр формы на главном экране, но по какой-то причине он возвращает неполную форму, или is_valid() не работает на этих экземплярах.

Я также смотрел на FormWizard, но похоже, что он не сохраняет в базе данных после каждого шага и ужасно сложен для реализации в уже работающей системе.

Любые советы приветствуются. Спасибо.

1 Ответ

0 голосов
/ 10 ноября 2018

Если я правильно понимаю ваши требования, то вам нужен способ отследить, заполнил ли пользователь все ваши формы или нет. Если это так, я бы предложил добавить модель, цель которой - точно это отследить. Что-то в форме:

class UserFormTracking(models.Model):
    user = models.ForeignKey(settings.AUTH_MODEL, ..., unique=True)
    form1_completed = models.BooleanField(default=False)
    ...
    formn_completed = models.BooleanField(default=False)

    @property
    def all_completed(self):
        return self.form1_completed and ... and self.formk_completed

Тогда я бы переопределил метод save() каждой формы чем-то вроде следующего (предполагая, что это метод save() K-й формы):

def save(self, user, **kwargs):
    instance = super(MyForm, self).save(**kwargs)
    forms_tracking_instance = UserFormTracking.objects.get_or_create(user=user)
    forms_tracking_instance.formk_completed = True
    forms_tracking_instance.save()

    return instance

Обратите внимание, что вам нужно передать пользователя методу save(). Это, вероятно, получится из запроса http, но это может отличаться. После этого все, что остается, чтобы проверить, заполнил ли пользователь u каждую форму, - это запросить модель UserFormTracking для экземпляра, пользователь которого u, а для каждого formk_completed установлено значение True. Помните, что для предотвращения несоответствий вы, вероятно, захотите выполнить переопределенные save() методы ваших форм внутри транзакции.

Конечно, это довольно фиксированное решение. Если ваше приложение может часто меняться (в смысле добавления или удаления форм), вам нужно будет предложить более гибкое решение. Но вы можете следовать той же идее.

...