我不知道这是否是正确的使用方法,如果没有,请告诉我:
我有一个像这样的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'
我不知道我做错了什么,你能告诉我什么和为什么?我不清楚函数之间的自我使用,谢谢!
答案 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
方法