LoginRequiredMixin,如何获取和使用redirect_field_name?

时间:2016-07-06 04:05:15

标签: python django

我不知道这是否是正确的使用方法,如果没有,请告诉我:

我有一个像这样的mixin保护的视图:

class ControlPanel_vw(LoginRequiredMixin, DetailView):
    template_name = 'controlPanel.html'
    login_url = '/login/'
    redirect_field_name = 'next'

我的登录视图收到如下:

class Login_vw(FormView):
    form_class = EmailAndPassword_fr
    success_url = '/'
    template_name = 'login.html'

    def get(self, request, *args, **kwargs):
        self.next = request.GET.get('next')
        return super(Login_vw, self).get(request, *args, **kwargs)

    def form_valid(self, form):
        formData_d = form.clean()
        email_f = formData_d.get("email")
        password_f = formData_d.get("password")

        print self.next

        return super(Login_vw, self).form_valid(form)

当我在get方法中打印self.next时效果很好。

我在“next”之前使用了“self”,意图可以从其他函数“form_valid”中使用它,所以当用户登录时我可以将他发送到他的最后一个url。

但是当我尝试打印self.next变量进行测试时,我得到:

  

'Login_vw'对象没有属性'next'

我不知道我做错了什么,你能告诉我什么和为什么?我不清楚函数之间的自我使用,谢谢!

2 个答案:

答案 0 :(得分:0)

form_valid()是从FormView s post()方法调用的,只有在有POST表单数据时才会运行该方法。

您正在self.next方法中保存get(),当有POST请求时将不会调用该方法 - 因此当您尝试在form_valid()中访问该值时,不会设置该值。

您无需在两个方法之间拆分此逻辑 - 为什么不在需要时获取next GET参数?

def form_valid(self, form):
    formData_d = form.clean()
    email_f = formData_d.get("email")
    password_f = formData_d.get("password")

    next = self.request.GET.get('next')
    # Do something with next...

    return super(Login_vw, self).form_valid(form)

答案 1 :(得分:0)

我删除了get方法并添加了get_context_data代替:

def get_context_data(self, **kwargs):
        context = super(Login_vw, self).get_context_data(**kwargs)
        context['next'] = self.request.GET.get('next')
        return context

然后在我的tamplate表单中添加了这个:

<input type="hidden" name="next" value="{{ next }}" />

然后在form_valid方法中检索&#34; next&#34;像这样的变量:

next = self.request.POST.get('next')

就是这样,在一个简短的解释中,get_context_data收到下一个网址,将其发送到模板表单,然后模板表单将其发送回form_valid方法