简体   繁体   English

Django - 登录并重定向到用户个人资料页面

[英]Django - Login and redirect to user profile page

I am trying to redirect a user who just logged in to his/her's respective account page.我正在尝试将刚刚登录到他/她各自帐户页面的用户重定向。

This question has been asked a few times, but most of them are old and use static urls like /accounts/profile/ : Django - after login, redirect user to his custom page --> mysite.com/username .这个问题已经被问过几次了,但大多数都是旧的,并且使用静态 URL,例如/accounts/profile/Django - 登录后,将用户重定向到他的自定义页面 --> mysite.com/username I would like to use dynamic url naming to achieve this solution.我想使用动态 url 命名来实现这个解决方案。

For example, what if my account landing page has the following url pattern?例如,如果我的帐户登录页面具有以下 url 格式怎么办?

url(r'^account/(?P<pk>\d+)/(?P<name>\w+)/$', AccountLanding.as_view(), name="account-landing" )`.

How would I pass the args in settings.py for LOGIN_REDIRECT_URL ?我将如何在settings.py中为LOGIN_REDIRECT_URL传递参数?

It isn't possible to use dynamic arguments (eg the primary key of the logged in user) in the LOGIN_REDIRECT_URL in your settings.py . 您无法在settings.pyLOGIN_REDIRECT_URL中使用动态参数(例如,已登录用户的主键)。

In Django 1.11+, you can subclass LoginView , and override get_success_url so that it dynamically redirects. 在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})

Note the url = self.get_redirect_url() line is required to handle redirects back to the previous page using the querystring, eg ?next=/foo/bar 注意,需要使用url = self.get_redirect_url()行来处理使用查询字符串返回到上一页的重定向,例如?next=/foo/bar

Then use your custom login view in your URL config. 然后在URL配置中使用自定义登录视图。

url(r'^login/$', MyLoginView.as_view(), name='login'),

For earlier versions of Django, it isn't possible to customise the function-based login view in the same way. 对于早期版本的Django,无法以相同的方式自定义基于函数的登录视图。

One work around is to create a view that redirects to your landing page: 一种解决方法是创建一个重定向到您的登录页面的视图:

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)

Create a url pattern for this view: 为此视图创建一个URL模式:

urlpatterns = [
    url(r'^account/$', account_redirect, name='account-redirect'),
]

Then use that view as LOGIN_REDIRECT_URL : 然后使用该视图作为LOGIN_REDIRECT_URL

LOGIN_REDIRECT_URL = 'account-redirect'

On Django 4.x there is a new attribute called next_page and you can use it as:在 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'))
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM