Django Сохранить незавершенный прогресс в форме - PullRequest
9 голосов
/ 12 ноября 2010

У меня есть веб-приложение django с несколькими пользователями, которые входят в систему и заполняют форму.

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

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

Решение, о котором я подумал, выглядит довольно не элегантным и нереалистичным: создайте кнопку «Сохранить частичную форму», которая сохранит словарь POST, преобразует его в файл полка и создайте «SavedPartialForm» "модель, соединяющая пользователя с частичными формами, сохраненными на полке. Это кажется разумным? Есть ли лучший способ сохранить POST dict непосредственно в БД? Или это дополнительный модуль, который выполняет частичное сохранение формы (что, по-видимому, довольно распространенное действие с веб-формами)?

Моя самая большая проблема с моим методом - я хочу, чтобы в конечном итоге я смог автоматически выполнить автоматическое сохранение формы (скажем, каждые 10 минут) в каком-то методе ajax / jquery, не нажимая кнопку и не отправляя запрос POST (например, чтобы пользователь не перенаправляется со страницы при срабатывании автосохранения). Я не очень знаком с jquery и мне интересно, можно ли это сделать.

Ответы [ 4 ]

8 голосов
/ 12 ноября 2010

Есть хорошее решение в Pro Django от Марти Алчина .В двух словах, вы создаете другую модель, которая содержит хэш формы, поле формы и сохраненное значение.При возобновлении вы просто загружаете в соответствии с формой в соответствии с ее хешем.

3 голосов
/ 08 января 2011

до сохранения:

for field in form.fields:
    form.fields[field].required = False

тогда:

form.save()
1 голос
/ 24 апреля 2014

Поместите в форму следующую информацию __init__

for field in form.fields:
    form.fields[field].required = False

Например:

class MySexyForm(Form):
    def __init__(self, *args, **kwargs):
        super(MySexyForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].required = False

Тогда звоните:

form = MySexyForm(...)
form.save()

Однако вам необходимо убедиться, что ваш метод clean() может обрабатывать любые пропущенные атрибуты, условно проверяя, существуют ли они в cleaned_data. Например, если проверка другого поля формы основана на customer_id, но ваша частичная форма не указала его, то customer_id не будет в cleaned_data.

Если это для формы модели, вы можете проверить, было ли значение в cleaned_data, и вернуться к instance.field, если оно отсутствовало, например;

def clean(self):
    inst = self.instance
    customer_id_new = self.cleaned_data.get('customer_id', None)
    customer_id_old = getattr(self.instance, 'customer_id') if inst else None
    customer_id = customer_id_new if customer_id_new else customer_id_old

Помните, что значение new value почти наверняка не будет в том же формате, что и старое значение, например, customer_id может фактически быть RelatedField на экземпляре модели, но pk int на данных формы. Опять же, вам нужно будет справиться с этими различиями типов в вашей чистоте.

Это одна из областей, где форм Джанго, к сожалению, не хватает.

1 голос
/ 12 ноября 2010

Проблема в том, что у вас есть несколько форм.

Частичное. Неполное. Полная. Готов к этому. Готов к этому.

Действительно, у вас есть Форма для этапа рабочего процесса.

В этом нет ничего плохого.

  1. Выясните, где вы находитесь в рабочем процессе.

  2. Заполните и представьте форму для следующего этапа.

Формы могут наследоваться друг от друга для сохранения повторяющихся методов проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...