2009-10-22 122 views
7

我想重定向一个用户到一个包含他的用户名(例如http://domain/username/)的网址,并试图找出如何做到这一点。我使用django.contrib.auth我的用户管理,所以我使用的设置LOGIN_REDIRECT_URL尝试:django LOGIN_REDIRECT_URL动态值

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail.. 

但似乎只接受固定的字符串,而不是东西,会后确定用户已登录。我还能如何完成此操作?

回答

17

解决方案是重定向到像/ userpage /这样的静态路由并将其重定向到最终的动态页面。

但我认为真正的解决方案是做一个新的视图,做你真正想要的。

from django.contrib.auth import authenticate, login 
from django.http import HttpResponseRedirect 

def my_view(request): 
    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) 
      HttpResponseRedirect('/%s/'%username) 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

http://docs.djangoproject.com/en/dev/topics/auth/#authentication-in-web-requests

约重写视图的详细信息。这是文档如何说重写这种事情。

+2

我更喜欢t他首先建议从静态/用户页面/重定向。这样,您仍然可以使用'django.contrib.auth.views'中的登录视图,该视图可能比手动视图更健壮。 – Alasdair 2009-10-22 17:32:21

+0

因为我试图简化网址并尽量减少重定向,您的解决方案看起来就像是要走的路。谢谢! – sa125 2009-10-23 10:44:40

+0

多么简单明了的答案,解决了我确切的问题。我为没有想到这个而感到羞愧。享受您的互联网点。 – Esteban 2013-04-19 01:18:21

0

将auth视图封装在您自己的自定义视图中,并在身份验证成功后重定向到任何您想要的位置。

from django.http import HttpResponseRedirect 
from django.contrib import auth 
from django.core.urlresolvers import reverse 

def login(request): 
    template_response = auth.views.login(request) 

    if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/': 
     return HttpResponseRedirect(reverse('user', args=(request.user.username,))) 


    return template_response 

另一种替代方法是使用查询参数next以指示在何处重定向到登录后。

<a href="{% url 'login' %}?next={{ request.path }}">sign in</a> 
0

随着基于类的django.contrib.auth.views.LoginView,你现在可以简单地覆盖get_success_url

urls.py:

url(r'^login$', MyLoginView.as_view(), name='login'), 
url(r'^users/(?P<username>[a-zA-Z0-9]+)$', MyAccountView.as_view(), name='my_account'), 

views.py

class MyLoginView(LoginView): 

    def get_success_url(self): 
     return reverse('my_account', args=[self.request.user.username])