django-allauth login_redirect 用户名为 slug 的页面
django-allauth login_redirect page with username as slug
我正在使用 Django 3.2 和 django-allauth 0.44
我在 settings.py
中设置了我的 LOGIN_REDIRECT_URL 如下:
LOGIN_REDIRECT_URL = 'profile-page'
在urls.py
中,我定义了以下路由:
path('accounts/profile/slug:username', AccountProfileView.as_view(), name='profile-page'),
当我登录时,(不出所料),我收到以下错误消息:
NoReverseMatch at /accounts/login/
Reverse for 'profile-page' with no arguments not found. 1 pattern(s) tried: ['accounts/profile/(?P[-a-zA-Z0-9_]+)$']
如何将登录用户的用户名参数传递(或指定)到路由?
LOGIN_REDIRECT_URL
应该指向用户成功登录您的网站后登陆的页面,除非他通过尝试访问任何需要授权的页面而被重定向到登录页面。
如果您想将用户重定向到特定页面,在此示例中是重定向到他自己的个人资料页面,您可以创建一个中间 URL,在访问时将用户重定向到他自己的个人资料页面。可以这样实现:
使用基于 class 的视图:
class CurrentUserProfileRedirectView(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('profile-page', kwargs={'username': request.user.username})
或使用基于函数的视图:
@login_required
def current_user_profile(request):
return redirect('profile-page', username=request.user.username)
接下来,将此重定向视图注册为常规视图,不需要任何参数,并将 LOGIN_REDIRECT_URL
设置为此视图的名称。
如果你的视图需要执行重定向,不是很简单,你需要覆盖get_success_url
方法,考虑到你使用django-allauth,你将需要覆盖allauth.account.views.LoginView
并且还为它编写您自己的 url 模式,以便使用您的覆盖视图。首先覆盖视图:
from django.urls import reverse
from allauth.account.views import LoginView as AllauthLoginView
from allauth.account.utils import get_next_redirect_url
class LoginView(AllauthLoginView):
def form_valid(self, form):
self.user = form.user # Get the forms user
return super().form_valid(form)
def get_success_url(self):
ret = (
get_next_redirect_url(self.request, self.redirect_field_name)
or reverse('profile-page', kwargs={'username': self.user.username})
)
return ret
接下来,无论您为 allauth 定义 urls,只需在它之前添加您自己的 url:
from path_to.view_above import LoginView # Change this import properly
urlpatterns = [
...
path('accounts/login/', LoginView.as_view(), name="account_login"),
path('accounts/', include('allauth.urls')),
...
]
另一种使用 allauth 的替代解决方案是使用自定义 ACCOUNT_ADAPTER
并覆盖它的 get_login_redirect_url
因为 LoginView
将在没有 next
参数的情况下在内部调用它。为此,首先继承自 allauth.account.adapter.DefaultAccountAdapter
:
from django.urls import reverse
from allauth.account.adapter import DefaultAccountAdapter
class MyAccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
return reverse('profile-page', kwargs={'username': request.user.username})
下一步 settings.py
设置 ACCOUNT_ADAPTER
:
ACCOUNT_ADAPTER = "path.to.MyAccountAdapter"
我正在使用 Django 3.2 和 django-allauth 0.44
我在 settings.py
中设置了我的 LOGIN_REDIRECT_URL 如下:
LOGIN_REDIRECT_URL = 'profile-page'
在urls.py
中,我定义了以下路由:
path('accounts/profile/slug:username', AccountProfileView.as_view(), name='profile-page'),
当我登录时,(不出所料),我收到以下错误消息:
NoReverseMatch at /accounts/login/ Reverse for 'profile-page' with no arguments not found. 1 pattern(s) tried: ['accounts/profile/(?P[-a-zA-Z0-9_]+)$']
如何将登录用户的用户名参数传递(或指定)到路由?
LOGIN_REDIRECT_URL
应该指向用户成功登录您的网站后登陆的页面,除非他通过尝试访问任何需要授权的页面而被重定向到登录页面。
如果您想将用户重定向到特定页面,在此示例中是重定向到他自己的个人资料页面,您可以创建一个中间 URL,在访问时将用户重定向到他自己的个人资料页面。可以这样实现:
使用基于 class 的视图:
class CurrentUserProfileRedirectView(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('profile-page', kwargs={'username': request.user.username})
或使用基于函数的视图:
@login_required
def current_user_profile(request):
return redirect('profile-page', username=request.user.username)
接下来,将此重定向视图注册为常规视图,不需要任何参数,并将 LOGIN_REDIRECT_URL
设置为此视图的名称。
如果你的视图需要执行重定向,不是很简单,你需要覆盖get_success_url
方法,考虑到你使用django-allauth,你将需要覆盖allauth.account.views.LoginView
并且还为它编写您自己的 url 模式,以便使用您的覆盖视图。首先覆盖视图:
from django.urls import reverse
from allauth.account.views import LoginView as AllauthLoginView
from allauth.account.utils import get_next_redirect_url
class LoginView(AllauthLoginView):
def form_valid(self, form):
self.user = form.user # Get the forms user
return super().form_valid(form)
def get_success_url(self):
ret = (
get_next_redirect_url(self.request, self.redirect_field_name)
or reverse('profile-page', kwargs={'username': self.user.username})
)
return ret
接下来,无论您为 allauth 定义 urls,只需在它之前添加您自己的 url:
from path_to.view_above import LoginView # Change this import properly
urlpatterns = [
...
path('accounts/login/', LoginView.as_view(), name="account_login"),
path('accounts/', include('allauth.urls')),
...
]
另一种使用 allauth 的替代解决方案是使用自定义 ACCOUNT_ADAPTER
并覆盖它的 get_login_redirect_url
因为 LoginView
将在没有 next
参数的情况下在内部调用它。为此,首先继承自 allauth.account.adapter.DefaultAccountAdapter
:
from django.urls import reverse
from allauth.account.adapter import DefaultAccountAdapter
class MyAccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
return reverse('profile-page', kwargs={'username': request.user.username})
下一步 settings.py
设置 ACCOUNT_ADAPTER
:
ACCOUNT_ADAPTER = "path.to.MyAccountAdapter"