在基于 class 的视图的 form_valid() 中设置时 Django 会话变量丢失

Django session variables lost when set in form_valid() of class-based views

使用 Django,如果我在 django.views.generic.edit.FormView class 的 post() 方法中设置会话变量,则该变量可用于未来的请求。

例如

def post(self, request, *args, **kwargs):
    """
    Store useful data in session variable for future requests 
    """
    if 'useful_data' in request.POST:
        request.session['useful_data'] = useful_data

    return HttpResponseRedirect(self.get_success_url())

但是,如果我尝试通过 django.views.generic.edit.FormView class 的 form_valid() 方法设置会话变量,我对变量所做的更改似乎在下一个请求。

例如

def form_valid(self, form):
    """
    Store useful data in session variable for future requests 
    """
    # Useful data that I only want to update if the form was validated
    self.request.session['useful_data'].update(form.cleaned_data['useful_data'])

    return HttpResponseRedirect(self.get_success_url())

那么,如何从 django.views.generic.edit.FormView class 的 form_valid() 方法对会话变量进行持久更改?

我怀疑问题可能出在更新部分:

self.request.session['useful_data'].update(form.cleaned_data['useful_data'])

如果我们看一下 documentation,问题可能是 django 不知道会话已被修改,因此不会更改它。

要验证这一点,请明确表示会话已被修改:

self.request.session['useful_data'].update(form.cleaned_data['useful_data'])
self.request.session.modified = True

或者不使用 update() 直接赋值,就像 documentation:

self.request.session['useful_data'] = form.cleaned_data['useful_data']

希望对您有所帮助!