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/' 其中 pk 可以是分配给用户的任何特定键。 @RA123 我不明白你的意思。如果您想添加自己的答案,我已经重新打开了这个问题。 不,抱歉。我不想添加答案,因为此方法已被弃用。但是,如果 OP 仍想使用它,我只想提一下。 docs.djangoproject.com/en/1.9/ref/settings/#login-redirect-url 哦,你的意思是他们可以使用LOGIN_REDIRECT_URL = 'path.to.account_redirect' 而不是LOGIN_REDIRECT_URL = 'account-redirect'?我认为这没有任何优势 - 你仍然必须创建一个视图和 url 模式,并且正如你所说,不推荐使用像这样的虚线 Python 路径。 是的,这就是我刚才提到它的原因。我突然想到了。

以上是关于Django - 登录并重定向到用户个人资料页面的主要内容,如果未能解决你的问题,请参考以下文章

按用户名搜索用户并重定向到 Django 中的用户页面

Django Createview根据外键的id保存表单并重定向到页面

如何在 Django 中使用基于类的视图将用户重定向到登录页面? [复制]

如果会话过期,如果没有活动并重定向登录页面,则烧瓶注销

Django 使用绑定表单重定向到另一个视图

Firebase Facebook 登录 - 检测用户登录状态并重定向