使用会话保存并检索表单?

时间:2017-03-09 02:59:41

标签: django

我有一个context_processor.py文件,其中包含以下功能

def include_user_create(request):

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

    return { 'create_user_form' : form } 

我用它在我的base.html模板中显示我的注册表,以便我可以将它重用于所有页面。函数create_user处理表单提交

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)

如果表单无效,我想保存表单,以便context_processor可以重复使用表单,以便保存错误,以便它们可以显示在模板中。

这样做会给我一个错误:

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

是否有可能以某种方式使其工作?

1 个答案:

答案 0 :(得分:1)

您遇到此错误,因为表单对象不是JSON可序列化的,默认会话序列化程序是serializers.JSONSerializer

尝试将其更改为settings.py中的pickle序列化程序:

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

修改

使用此设置,您不必关心pickle序列化,您只需编写:

request.session['form'] = form