Django - 登录后,将用户重定向到他的自定义页面 - > mysite.com/username

ava*_*tar 42 django django-urls django-views django-settings

默认情况下,登录后django会将用户重定向到帐户/配置文件页面,或者如果您编辑LOGIN_REDIRECT_URL,则可以将用户发送到您在settings.py中指定的另一个页面.

这很棒,但我希望用户(登录后)被重定向到一个自定义页面,该页面的链接看起来像这样:mysite.com/username.因此,默认帐户/配置文件或LOGIN_REDIRECT_URL设置在这种情况下不起作用,因为两者都是静态的.就我而言username,每个用户的地址部分都会发生变化.

当用户登录时,我如何能够做到这一点的任何想法将转到自定义用户页面,该用户页面在地址中具有用户名称,如: mysite.com/username?任何输入都是真正的赞赏.

小智 69

更简单的方法依赖于页面LOGIN_REDIRECT_URL的重定向.要实现的关键是用户信息自动包含在请求中.

假设:

LOGIN_REDIRECT_URL = '/profiles/home'
Run Code Online (Sandbox Code Playgroud)

并且您已配置urlpattern:

(r'^profiles/home', home),
Run Code Online (Sandbox Code Playgroud)

然后,您需要为视图编写的所有内容home()是:

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

@login_required
def home(request):
    return HttpResponseRedirect(
               reverse(NAME_OF_PROFILE_VIEW, 
                       args=[request.user.username]))
Run Code Online (Sandbox Code Playgroud)

NAME_OF_PROFILE_VIEW您正在使用的回调的名称在哪里.使用django-profiles,NAME_OF_PROFILE_VIEW可以是'profiles_profile_detail'.

  • 基于类的视图怎么样? (2认同)

Abi*_*d A 10

您可以按照此处的说明对用户进行身份验证和登录:http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

这将使您可以访问用户对象,从中可以获取用户名,然后对自定义URL执行HttpResponseRedirect.


kim*_*mbo 7

如果您使用的是 Django 的 built-in LoginView,它将next作为上下文,即“成功后重定向到的 URL login。这也可能包含一个查询字符串。” (见文档

也来自文档:

“如果登录成功,视图将重定向到 中指定的 URL next。如果没有提供 next,它会重定向到settings.LOGIN_REDIRECT_URL(默认为 /accounts/profile/)。”

示例代码:

urls.py

from django.urls import path
from django.contrib.auth import views as auth_views

from account.forms import LoginForm # optional form to pass to view


urlpatterns = [
    ...

    # --------------- login url/view -------------------
    path('account/login/', auth_views.LoginView.as_view(
        template_name='login.html',  
        authentication_form=LoginForm, 
        extra_context={ 

            # option 1: provide full path
            'next': '/account/my_custom_url/', 

            # option 2: just provide the name of the url
            # 'next': 'custom_url_name',  
        },
    ), name='login'),

    ...
]
Run Code Online (Sandbox Code Playgroud)

login.html

...

<form method="post" action="{% url 'login' %}">

  ...

  {# option 1 #}
  <input type="hidden" name="next" value="{{ next }}">

  {# option 2 #}
  {# <input type="hidden" name="next" value="{% url next %}"> #}

</form>
Run Code Online (Sandbox Code Playgroud)


小智 6

是! 在您的settings.py中定义以下内容

LOGIN_REDIRECT_URL = '/your-path'
Run Code Online (Sandbox Code Playgroud)

并让'/ your-path'是一个简单的View,它可以查找self.request.user并执行返回HttpResponseRedirect对象所需的任何逻辑。

更好的方法可能是定义一个简单的URL,就像在'/simple'其中执行查找逻辑一样。该URL看起来更漂亮,为您节省了一些工作,等等。


小智 6

使用基于类的视图时,另一种选择是使用分派方法。 https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/

示例代码:

设置.py

LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home'
Run Code Online (Sandbox Code Playgroud)

网址.py

from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
path('', HomeView.as_view(), name='home'),
path('login/', auth_views.LoginView.as_view(),name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Run Code Online (Sandbox Code Playgroud)

视图.py

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.views.generic import View
from django.shortcuts import redirect

@method_decorator([login_required], name='dispatch')
class HomeView(View):
    model = models.User

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login')
        elif some-logic:
            return redirect('some-page') #needs defined as valid url
        return super(HomeView, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)