django LOGIN_REDIRECT_URL具有动态值

sa1*_*125 7 django login url-routing

我正在尝试将用户重定向到包含其用户名的网址(例如http:// domain/username /),并试图弄清楚如何执行此操作.我正在使用django.contrib.auth进行用户管理,所以我尝试在设置中使用LOGIN_REDIRECT_URL:

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail..
Run Code Online (Sandbox Code Playgroud)

但它似乎只接受固定的字符串,而不是在用户登录后确定的东西.我怎么能完成这个?

eme*_*ryc 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.
Run Code Online (Sandbox Code Playgroud)

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

有关重写视图的更多信息.这就是文档如何覆盖这种事情.

  • 我更喜欢第一个从static/userpage /重定向的建议.这样,您仍然可以使用`django.contrib.auth.views`中的登录视图,该视图可能比手动滚动视图更强大. (2认同)

Fla*_*ash 7

使用基于类的django.contrib.auth.views.LoginView,您现在可以简单地覆盖get_success_url

网址.py:

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

视图.py

class MyLoginView(LoginView):

    def get_success_url(self):
        return reverse('my_account', args=[self.request.user.username])
Run Code Online (Sandbox Code Playgroud)