from django.conf import settings | |
from django.contrib.auth import login, REDIRECT_FIELD_NAME | |
from .forms import LoginForm, ResetPasswordForm | |
from django.utils.decorators import method_decorator | |
from django.views.generic import FormView | |
from django.views.decorators.cache import never_cache | |
from django.views.decorators.csrf import csrf_protect | |
class LoginView(FormView): | |
template_name = 'login.html' | |
form_class = LoginForm | |
@method_decorator(csrf_protect) | |
@method_decorator(never_cache) | |
def dispatch(self, *args, **kwargs): | |
return super(LoginView, self).dispatch(*args, **kwargs) | |
def set_test_cookie(self): | |
self.request.session.set_test_cookie() | |
def check_and_delete_test_cookie(self): | |
if self.request.session.test_cookie_worked(): | |
self.request.session.delete_test_cookie() | |
return True | |
return False | |
def get(self, request, *args, **kwargs): | |
self.set_test_cookie() | |
return super(LoginView, self).get(self, request, *args, **kwargs) | |
def form_valid(self, form): | |
self.check_and_delete_test_cookie() | |
login(self.request, form.get_user()) | |
return super(LoginView, self).form_valid(form) | |
def form_invalid(self, form): | |
self.set_test_cookie() | |
return super(LoginView, self).form_invalid(form) | |
def get_context_data(self, **kwargs): | |
context = super(LoginView, self).get_context_data(**kwargs) | |
context['second_form'] = ResetPasswordForm | |
return context | |
def get_success_url(self): | |
if self.success_url: | |
redirect_to = self.success_url | |
else: | |
# 问题已定位,这里无法获取next的值,求解 | |
redirect_to = self.request.REQUEST.get(REDIRECT_FIELD_NAME, '') | |
host_name = urlparse(redirect_to)[1] | |
dir_name = urlparse(redirect_to)[2] | |
if not redirect_to: | |
redirect_to = settings.LOGIN_REDIRECT_URL | |
elif dir_name.lower() == '/logout': | |
redirect_to = settings.LOGIN_REDIRECT_URL | |
elif host_name and host_name != self.request.get_host(): | |
redirect_to = settings.LOGIN_REDIRECT_URL | |
return redirect_to |
![]() |
1
melaozhu OP 这样的URL
http://mydomain.com/login?next=/admin/staff 登录后不能跳转回 http://mydomain.com/admin/staff 没人在啊。。。 会不会是我的urls.py定义有问题 url( regex = r'^login$', view = LoginView.as_view(), name = 'login' ), 我是这样定义的。 |
![]() |
2
aggron 2013-10-23 11:07:29 +08:00 ![]() 已登录用户不显示登录表单,在get方法里面加
if request.user.is_authenticated(): return redirect('/') REDIRECT_FIELD_NAME 默认应该就是获取URL中的`next` parameter,按照你给的URL格式应该是没问题的,或许你看下LoginForm中的代码有没redirect之类的代码。 你贴的urls.py是全的吗,没看到/admin/staff相关的定义 |
![]() |
3
melaozhu OP 不好意思,还有一部分没贴。
# urls.py urlpatterns = patterns('', url(r'^admin/staff', include('auth2.urls')), ) # auth2/urls.py urlpatterns = patterns('', url( regex = r'^$', view = StaffListView.as_view(), name = 'staff-list', ), ) 我现在就是没法获取到next后面的地址,我是这样定义的 from django.contrib.auth.forms import AuthenticationForm class LoginForm(AuthenticationForm): error_messages = {} username = {} password = {} 只是冲定义了这三个东西,其它函数未动,貌似AuthenticationForm中只没有redirect之类语句。 我现在怀疑get_success_url()函数中是否可以获取到REDIRECT_FIELD_NAME的值。 |
![]() |
4
melaozhu OP @aggron 兄才
from django.core.urlresolvers import reverse def get(self, request, *args, **kwargs): self.set_test_cookie() if self.request.user.is_authenticated: return reverse('home') return super(LoginView, self).get(self, request, *args, **kwargs) 我加了这段后,报错了。。。 Exception Type: AttributeError Exception Value: 'str' object has no attribute 'has_header' |
![]() |
5
aggron 2013-10-23 11:41:38 +08:00
reverse 返回的只是一个str类型的url
应该用return redirect(reverse('home')) |
![]() |
7
aggron 2013-10-23 13:46:14 +08:00
BTW: is_authenticated是个方法,不是property,要用user.is_authenticated():
|
8
daoluan 2013-10-23 15:36:49 +08:00
重定向回去就好了. redirect
|