我想允许用户在使用登录表单时默认转到他们的用户页面(例如:mywebsite.com/userpage)。
此外,如果他们访问网站上的其他受密码保护的页面,请先将其重定向到登录页面,然后通过身份验证后将其返回到他们尝试访问的原始页面。
这是我到目前为止的登录功能:
views.py
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request.POST)
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a successpage
if request.POST['next']:
return HttpResponseRedirect(request.POST['next'])
else:
return HttpResponseRedirect("/" + username + "/")
else:
errors = 'This account has been disabeled.'
else:
# Return an 'invalid login' error message.
errors = 'There is a problem with the user name and/or the password. Please try again.'
else:
form = AuthenticationForm()
return render_to_response("registration/my_login.html", locals(), context_instance=RequestContext(request))
urls.py
urlpatterns = patterns('',
url(r'^login/$', user_login,),
my_login.html
<form action="." method="post" >{% csrf_token %}
{{errors}}
{{ form.as_p }}
<p class="submit"><button type="submit" name="login_user_button" value="Login">Log in</button></p>
<input type="hidden" name="next" value="{{ next }}">
</form>
我的问题是我不知道如何获取“下一个”变量的值,因此我可以在我的user_login
函数中使用它来进行重定向。
正如您所看到的,我尝试使用request.POST['next']
来获取它,但是附带一个空字符串,因此由于某种原因没有值被签名到“next”变量。
有什么想法吗?
答案 0 :(得分:2)
我的建议 - 不要打扰使用登录功能。你只是重新发明轮子。相反,请使用django.auth模块附带的login view,并将用户发送到插页式页面(在settings.LOGIN_REDIRECT_URL中定义的网址),将其重定向到需要的位置。
此插页式广告视图可以简单如下:
@login_required
def index(request):
return redirect('user-page', request.user.username)
请注意,我已将此重定向更改为使用命名视图。如果用户给自己一个与网站网址一致的用户名,你不希望发生奇怪的事情!
还要注意login_required装饰器。这会自动为您提供所需的登录页面重定向。