Django:如何在FormView的get()方法中提供上下文(也使用请求参数)
我想给我的FormView中的get()方法提供一些额外的背景信息。我需要用到get()方法,因为我需要先运行一些逻辑,检查是否需要重定向。同时,我还需要访问请求对象(因为我需要检查会话数据)。但是我不知道该怎么做。下面是简化的代码。
尝试 1:
class LoginView(FormView):
template_name = 'members/login.html'
form_class = LoginForm
def get(self, request):
# check if to redirect
if self.request.session.get('user'):
return redirect('/dashboard/')
# render page with extra context
else:
context = super(LoginView, self).get(request)
context['message'] = self.request.session['message']
return context
没有错误,但上下文在模板中没有显示出来。
尝试 2:
class LoginView(FormView):
template_name = 'members/login.html'
form_class = LoginForm
def get_context_data(self, request, **kwargs):
# check if to redirect
if self.request.session.get('user'):
return redirect('/dashboard/')
# render page with extra context
else:
context = super(LoginView, self).get_context_data(**kwargs)
context['message'] = self.request.session['message']
return context
出现了 TypeError: get_context_data() takes exactly 2 arguments (1 given)
的错误。
附言:这项工作与解决Django的消息中间件的bug有关,这个中间件在本地运行得很好,但在线上(Heroku)并不是100%可靠,只在某些页面上有效。唉,真让人沮丧……
1 个回答
9
在使用 get_context_data
方法的时候,不需要传入 request
这个参数。你还应该使用 dispatch 方法来检查用户是否已经登录。
class LoginView(FormView):
template_name = 'members/login.html'
form_class = LoginForm
def dispatch(self, *args, **kwargs):
"""Use this to check for 'user'."""
if request.session.get('user'):
return redirect('/dashboard/')
return super(LoginView, self).dispatch(*args, **kwargs)
def get_context_data(self, **kwargs):
"""Use this to add extra context."""
context = super(LoginView, self).get_context_data(**kwargs)
context['message'] = self.request.session['message']
return context