[Fixed]-Django: Save and restore a form's state using a cookie

24👍

This already sounds like a good plan. But if there is no pressure on using cookies, I would resort to using the session instead. That way you won’t hit a size limit on cookies, and transmitting cookies with higher size can slow down your response time.

form = MyForm(initial=request.session.get('form_data'))
...
if form.is_valid():
    request.session['form_data'] = form.cleaned_data

1👍

As an extension to this, here is a way I have found to use sessions to save the form data with a class-based view:

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
        ...

Leave a comment