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

时间:2011-02-02 03:53:30

标签: django django-views django-urls django-settings

默认情况下,登录后django会将用户重定向到帐户/个人资料页面,或者如果您编辑LOGIN_REDIRECT_URL,则可以将用户发送到您在settings.py中指定的其他页面。

这很棒,但我希望将用户(登录后)重定向到自定义页面,该页面的链接如下所示:mysite.com/username。因此,默认帐户/配置文件或LOGIN_REDIRECT_URL设置在这种情况下不起作用,因为两者都是静态的。在我的情况下,地址的username部分会针对每个用户进行更改。

任何想法如何在用户登录时如此实现,将转到自定义用户页面,该用户页面在地址中具有用户名称,如:mysite.com/username?任何输入都是真正的赞赏。

7 个答案:

答案 0 :(得分:67)

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

假设:

LOGIN_REDIRECT_URL = '/profiles/home'

您已配置了urlpattern:

(r'^profiles/home', home),

然后,您需要为视图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]))

其中NAME_OF_PROFILE_VIEW是您正在使用的回调的名称。使用django-profiles,NAME_OF_PROFILE_VIEW可以是'profiles_profile_detail'。

答案 1 :(得分:7)

您可以按照此处所述验证并记录用户:http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

这将允许您访问User对象,您可以从中获取用户名,然后执行HttpResponseRedirect到自定义URL。

答案 2 :(得分:4)

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

LOGIN_REDIRECT_URL = '/your-path'

并且拥有' / your-path'是一个查找self.request.user的简单视图,并执行返回HttpResponseRedirect对象所需的任何逻辑。

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

答案 3 :(得分:3)

如果您使用的是Django内置的LoginView,它将以next作为上下文,即“ login成功后重定向到的URL。其中可能包含查询字符串也一样。” (请参阅docs

也来自文档:

“如果登录成功,则视图将重定向到next中指定的URL。如果未提供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'),

    ...
]

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>

答案 4 :(得分:1)

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

示例代码:

Settings.py

LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home'

urls.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'),
]

views.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)

答案 5 :(得分:0)

最近进入django并一直在寻找解决方案,并找到了一个可能有用的方法。

例如,如果使用allouth,默认重定向是accounts / profile。 使用用户名字段创建一个仅重定向到所选位置的视图,如下所示:

def profile(request):
    name=request.user.username
    return redirect('-----choose where-----' + name + '/')

然后创建一个在您的某个应用中捕获它的视图,例如:

def profile(request, name):
    user = get_object_or_404(User, username=name)
    return render(request, 'myproject/user.html', {'profile': user})

urlpatterns捕获的位置如下:

url(r'^(?P<name>.+)/$', views.profile, name='user')

适合我。

答案 6 :(得分:-3)

return render(request,'page_location/page_name')

return render(request,'home/page-login.html')