默认情况下,登录后django会将用户重定向到帐户/个人资料页面,或者如果您编辑了LOGIN_REDIRECT_URL
,您可以将用户发送到您在settings.py
中指定的另一个页面。
这是伟大的,但我希望用户(登录后)被重定向到一个自定义页面,该页面的链接看起来像这样:mysite.com/username
。因此,默认帐户/配置文件或LOGIN_REDIRECT_URL
设置在这种情况下将不起作用,因为两者都是静态的。在我的例子中,地址的username
部分对每个用户都有变化。
任何想法,我如何才能使它,所以当用户登录将去一个自定义的用户页面,有用户的名字在地址一样:mysite.com/username
?
9条答案
按热度按时间bbmckpt71#
一种更简单的方法依赖于从页面LOGIN_REDIRECT_URL重定向。要实现的关键是用户信息自动包含在请求中。
假设:
你已经配置了一个urlpattern:
然后,您需要为视图
home()
编写的所有内容是:其中
NAME_OF_PROFILE_VIEW
是您正在使用的回调的名称。使用django-profiles,NAME_OF_PROFILE_VIEW
可以是'profiles_profile_detail'。eimct9ow2#
您可以按照以下说明对用户进行身份验证和登录:https://docs.djangoproject.com/en/dev/topics/auth/default/#how-to-log-a-user-in
这将给予您能够访问User对象,您可以从中获取用户名,然后对自定义URL执行HttpResponseRedirect。
s6fujrry3#
是的!在您的settings.py中定义以下内容
让'/your-path'成为一个简单的View,它查找
self.request.user
并执行任何需要返回HttpResponseRedirect
对象的逻辑。更好的方法可能是定义一个简单的URL,如
'/simple'
,在那里执行查找逻辑。URL看起来更漂亮,为您节省了一些工作等。yb3bgrhw4#
如果你使用的是Django内置的
LoginView
,它将next
作为上下文,即“成功login
后重定向到的URL。这也可能包含一个查询字符串。”(参见文档)也来自docs:
“如果登录成功,视图将重定向到
next
中指定的URL。如果没有提供next,它会重定向到settings.LOGIN_REDIRECT_URL
(默认为/accounts/profile/)。示例代码:
urls.py
login.html
pinkon5k5#
当使用基于类的视图时,另一个选择是使用调度方法。https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/
示例代码:
tct7dpnv6#
我实际上更喜欢@Stu和其他人提到的方法,即创建一个新的URL和视图,以便我们可以将重定向逻辑放在那里。这更容易,用户也可以在浏览器中输入
example.com/profile
,以重定向到example.com/profile/username/
的个人资料。但另一种不需要定义额外URL的方法是扩展
LoginView
并使用profile视图的URL名称进行重定向。假设我们有两个名为
accounts
和pages
的应用程序,我们在pages
应用程序中定义了配置文件页面,如下所示:URLConf:
请注意,我们必须定义
app_name = 'pages'
,因为我们需要它来引用pages
应用程序的URL。然后,在
accounts
应用中,我们扩展了LoginView
并添加了重定向逻辑:成功登录后,将调用
form_valid()
方法,并将希望在配置文件URL中使用的参数添加到自定义类属性success_url_kwargs
中。最后,调用return super().form_valid(form)
首先使用户登录,然后重定向到get_success_url()
方法(参见code)给出的URL,我们定义该方法以返回所需的自定义URL。请注意,我们在自定义登录URL之后包含了
auth
应用程序的URL,以便在我们想要访问accounts/login/
时解决第一个URL。另外,如果我们需要访问用户模型示例,我们可以调用
form.get_user()
。这在某些情况下可能是有用的。例如,如果用户使用电子邮件登录,我们需要他的用户名,我们可以执行form.get_user().username
。2nbm6dog7#
最近我进入了django,并一直在寻找解决方案,并找到了一个可能有用的方法。
例如,如果使用allouth,默认重定向是accounts/profile。使用username字段创建一个仅重定向到所选位置的视图,如下所示:
然后创建一个视图,在您的某个应用中捕获它,例如:
其中的urlpatterns捕获看起来像这样:
对我来说很好。
cl25kdpy8#
对我很有效
iibxawm49#
将此代码放在登录html页面中。例如,如果您直接访问登录页面(例如:/accounts/login/),则“next”值将为None,即登录后,它不知道您必须重定向到哪个页面,直到您在设置页面中指定“LOGIN_REDIRECT_URL”(例如:LOGIN_REDIRECT_URL=/dashboard/)。如果您在设置页面中指定'LOGIN_REDIRECT_URL',如示例所示,则登录后它将重定向到'/dashboard/' url。
如果您需要访问另一个也需要登录才能查看的url(例如:/items/).所以当您访问'localhost:8000/items/',因为它需要登录查看它将重定向到'localhost:8000/accounts/login/?next=/items/'.在这里,“next”的值将是“items”,但问题是,当您在设置页面中指定“LOGIN_REDIRECT_URL”时,它总是在登录后重定向到/dashboard/ url。
因此,上面的html代码有助于重定向,如果'next'值为None,那么它将转到我们指定为隐藏输入值的页面。如果'next'不是None,那么它将根据'next'的值重定向