vandelay
vandelay

Reputation: 2065

Save and retrieve a form with session?

I have a context_processor.py file with the following function

def include_user_create(request):

    if 'form' not in request.session:
        form = CreateUserForm()
    else:
        form = request.session['form']

    return { 'create_user_form' : form } 

I use this to display my register in my base.html template, so that I may reuse it for all pages. A function create_user handles the form submit

def create_user(request):

    form = CreateUserForm(request.POST or None, request.FILES or None)

    if request.method == 'POST':

        if form.is_valid():
            user = form.save(commit=False)            
            user.save()           
            user = authenticate(username=user.email, password=user.password)
        else:
            request.session['form'] = form #<--- save

    next = request.POST.get('next', '/')
    return HttpResponseRedirect(next)

If the form is invalid I'd like to save the form so that the context_processor may reuse the form, for the purpose of saving the errors so they may be displayed in the template.

Doing this gives me a error:

TypeError: <CreateUserForm bound=True, valid=False, fields=(email;password;confirm_password)> is not JSON serializable

Is it possible to get this to work somehow?

Upvotes: 2

Views: 1617

Answers (1)

albar
albar

Reputation: 3100

You have this error because a form object is not JSON serializable, and the default session serializer is serializers.JSONSerializer.

Try to change it to a pickle serializer in your settings.py:

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

EDIT:

With this setting, you don't have to care about pickle serialization, you just have to write:

request.session['form'] = form

Upvotes: 2

Related Questions