Django - 登录并重定向到用户个人资料页面
Posted
技术标签:
【中文标题】Django - 登录并重定向到用户个人资料页面【英文标题】:Django - Login and redirect to user profile page 【发布时间】:2016-07-05 16:51:24 【问题描述】:我正在尝试将刚刚登录的用户重定向到他/她各自的帐户页面。
这个问题已经被问过几次了,但大多数都是旧的,并且使用静态网址,如/accounts/profile/
:Django - after login, redirect user to his custom page --> mysite.com/username。我想使用动态 url 命名来实现这个解决方案。
例如,如果我的帐户登录页面具有以下 url 模式怎么办?
url(r'^account/(?P<pk>\d+)/(?P<name>\w+)/$', AccountLanding.as_view(), name="account-landing" )`.
如何将settings.py
中的参数传递给LOGIN_REDIRECT_URL
?
【问题讨论】:
Stu 在您链接到的页面上回答了您的问题。 @Alasdair 不,不是。我再次问这个问题的原因是看看自从 Django 从那以后已经更新了几次以来,这 4 年里是否有任何新的发展,我认为这是完全有理由质疑的。 @Alasdair Stu 从未提及,正如您所说,在LOGIN_REDIRECT_URL
中使用动态参数是不可能的,这基本上是我正在尝试的;如果这种情况发生了变化。
不,自提出该问题以来没有任何变化。 Ticket 19551 已关闭,以支持将登录视图转换为易于覆盖的基于类的视图 (ticket 17209)。由于这还没有发生,唯一的解决方案是通过另一个页面重定向,正如 Stu 和我所描述的那样。
基于类的 LoginView
是在 Django 1.11 中添加的,因此您现在可以覆盖 get_success_url
并返回用户个人资料页面的 URL。
【参考方案1】:
在 Django 4.x 上有一个名为 next_page
的新属性
您可以将其用作:
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy
class MyLoginView():
...
next_page = reverse_lazy('profile', kwargs='id': pk,
name='username'))
...
【讨论】:
【参考方案2】:您的settings.py
中的LOGIN_REDIRECT_URL
不能使用动态参数(例如登录用户的主键)。
在 Django 1.11+ 中,您可以继承 LoginView
,并覆盖 get_success_url
以便动态重定向。
from django.contrib.auth.views import LoginView
class MyLoginView():
def get_success_url(self):
url = self.get_redirect_url()
return url or reverse('account_landing', kwargs='pk': self.request.user.pk, 'name': self.request.user.username)
注意url = self.get_redirect_url()
行是处理使用查询字符串重定向回上一页所必需的,例如?next=/foo/bar
然后在您的 URL 配置中使用您的自定义登录视图。
url(r'^login/$', MyLoginView.as_view(), name='login'),
对于早期版本的 Django,无法以相同的方式自定义基于函数的登录视图。
一种解决方法是创建一个重定向到您的着陆页的视图:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def account_redirect(request):
return redirect('account-landing', pk=request.user.pk, name=request.user.username)
为此视图创建一个 url 模式:
urlpatterns = [
url(r'^account/$', account_redirect, name='account-redirect'),
]
然后将该视图用作LOGIN_REDIRECT_URL
:
LOGIN_REDIRECT_URL = 'account-redirect'
【讨论】:
LOGIN_REDIRECT_URL 也可以分配一个查看方法,可以将其设置为重定向到 'account-redirect/LOGIN_REDIRECT_URL = 'path.to.account_redirect'
而不是LOGIN_REDIRECT_URL = 'account-redirect'
?我认为这没有任何优势 - 你仍然必须创建一个视图和 url 模式,并且正如你所说,不推荐使用像这样的虚线 Python 路径。
是的,这就是我刚才提到它的原因。我突然想到了。以上是关于Django - 登录并重定向到用户个人资料页面的主要内容,如果未能解决你的问题,请参考以下文章
Django Createview根据外键的id保存表单并重定向到页面