django-allauth login_redirect 页面,用户名为 slug

如何解决django-allauth login_redirect 页面,用户名为 slug

我正在使用 Django 3.2 和 django-allauth 0.44

我在 settings.py 中设置了我的 LOGIN_REDIRECT_URL,如下所示:

LOGIN_REDIRECT_URL = '个人资料页面'

urls.py 中,我定义了以下路线:

path('accounts/profile/slug:username',AccountProfileView.as_view(),name='profile-page'),

当我登录时(不出所料),我收到以下错误消息:

noreverseMatch 在 /accounts/login/ 反转 'profile-page' 没有找到任何参数。尝试了 1 个模式:['accounts/profile/(?P[-a-zA-Z0-9_]+)$']

如何将登录用户用户名参数传递(或指定)到路由?

解决方法

如果您的视图需要执行不是很简单的重定向,则需要覆盖 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 定义网址,只需在其之前添加您自己的网址:

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.pyACCOUNT_ADAPTER 中的下一个:

ACCOUNT_ADAPTER = "path.to.MyAccountAdapter"
,

LOGIN_REDIRECT_URL 应指向用户成功登录您的网站后登陆的页面,除非他通过尝试访问任何需要授权的页面而被重定向到登录页面。

如果您想将用户重定向到特定页面,在此示例中是他自己的个人资料页面,您可以创建一个中间 URL,在访问时将用户重定向到他自己的个人资料页面。可以这样完成:

使用基于类的视图:

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 设置为此视图的名称。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?