簡體   English   中英

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 = '個人資料頁面'

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 種模式:['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 的 url,只需在它之前添加您自己的 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"

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設置為此視圖的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM