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

pet*_*ete 3 python django django-views

我试图在我的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
Run Code Online (Sandbox Code Playgroud)

没有错误,但模板中没有上下文.

尝试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
Run Code Online (Sandbox Code Playgroud)

入门 TypeError: get_context_data() takes exactly 2 arguments (1 given)

PS这项工作涉及一个解决方法Django的错误消息中间件似乎在本地完美地工作但在现场(Heroku)不是100%可靠,仅在某些页面上呈现.呃,沮丧的情况......

pat*_*eet 8

request参数get_context_data方法.您还应该使用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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,它做到了。嗯,我以为我总是必须传入请求对象,否则它无法访问它。就像我以为我掌握了 Django 基于类的视图一样.. (2认同)