默认情况下,登录后django会将用户重定向到帐户/个人资料页面,或者如果您编辑LOGIN_REDIRECT_URL,则可以将用户发送到您在settings.py中指定的其他页面。
这很棒,但我希望将用户(登录后)重定向到自定义页面,该页面的链接如下所示:mysite.com/username
。因此,默认帐户/配置文件或LOGIN_REDIRECT_URL设置在这种情况下不起作用,因为两者都是静态的。在我的情况下,地址的username
部分会针对每个用户进行更改。
任何想法如何在用户登录时如此实现,将转到自定义用户页面,该用户页面在地址中具有用户名称,如:mysite.com/username
?任何输入都是真正的赞赏。
答案 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')