Django: сохранение и восстановление состояния формы с помощью файла cookie

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

Лучшее, что я смог придумать, это выбрать cleaned_data и сохранить его как файл cookie, а затем воссоздать из него форму.


person olamundo    schedule 11.02.2011    source источник


Ответы (2)


Это уже звучит как хороший план. Но если нет давления на использование файлов cookie, я бы вместо этого прибегнул к использованию сеанса. Таким образом, вы не достигнете предела размера файлов cookie, а передача файлов cookie большего размера может замедлить время отклика.

form = MyForm(initial=request.session.get('form_data'))
...
if form.is_valid():
    request.session['form_data'] = form.cleaned_data
person Reiner Gerecke    schedule 11.02.2011
comment
если вам по какой-то причине нужно снова проверить восстановленную форму, сделайте form = MyForm(request.session.get('form_data'). Использование инициалов делает форму неограниченной, а form.is_valid() всегда возвращает False, даже если ошибок нет. Форма должна быть привязана к данным, чтобы использовать метод is_valid(). - person javed; 09.08.2016
comment
Это не сработает, если у вас есть дата в полезной нагрузке. Вы получаете эту ошибку: TypeError: Object of type 'date' is not JSON serializable. Вы можете использовать: form_data = json.dumps(list(form.cleaned_data),cls=DjangoJSONEncoder) - person stephen; 12.04.2018

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

from django.views.generic.edit import FormView

class MyFormView(FormView):
    template_name = 'myform.html'
    form_class = MyForm
    success_url = '/success/'

    def get_form_kwargs(self):
        """
        The FormMixin uses this to populate the data from the POST request.
        Here, first try to populate it from the session data, if any;
        if there is POST data, it should override the session data.
        """
        kwargs = {'data': self.request.session.get('form_data', None)}
        kwargs.update(super(MyFormView, self).get_form_kwargs())
        return kwargs

    def form_valid(self, form):
        ...
        # save the form data to the session so it comes up as default next time
        self.request.session['form_data'] = form.cleaned_data
        ...
person Racing Tadpole    schedule 16.07.2013