Django:如何在FormView的get()方法中提供上下文(也使用请求参数)

3 投票
1 回答
8240 浏览
提问于 2025-04-17 23:13

我想给我的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

撰写回答