結論
LoginRequiredMixin
を継承したカスタムクラスを作成し、handle_no_permission
関数をオーバーライドしてリダイレクト部分を実装することでnext
パラメータを付与させないようにできます。
前提
- 使用モジュールの各バージョンは以下です
- Django 3.2.19
現象確認
djangoでLoginRequiredMixin
を継承したViewは、未ログインでアクセスするとログインURLにリダイレクトされます。この時、ログイン後にリダイレクト前のViewに帰ってこれるようにURLに「next」のクエリパラメータが付与されています。
…
# 未ログインでLoginRequiredMixin継承したViewにアクセスしたときにリダイレクトされるURL
LOGIN_URL = '/loginform'
…
from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
# このviewのルーティングは「/myapp/Index」
class IndexView(LoginRequiredMixin, TemplateView):
template_name = "myapp/index.html"
原因
LoginRequiredMixin
の仕様によるものです。
原因を踏まえての解決策
LoginRequiredMixin
の仕様そのものを変えてしまうのは難しいと思います。そこでLoginRequiredMixin
を継承したMixinクラスを用意してカスタマイズをしていきます。
より具体的にはMixinカスタマイズクラスでhandle_no_permission
関数をオーバーライドして「next」パラメータを付与させないようにします。
手順
アプリフォルダの中に新規でpyファイル用意して以下のカスタムMixinクラスを作成します。
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect
class CustomLoginRequiredMixin(LoginRequiredMixin):
def handle_no_permission(self):
if self.raise_exception or self.request.user.is_authenticated:
return super().handle_no_permission()
else:
return redirect(self.get_login_url())
次に、「next」パラメータを付与させないViewに作成したMixinクラスを継承します。
from django.shortcuts import render
#from django.contrib.auth.mixins import LoginRequiredMixin カスタムクラスを使用するため不要
from django.views.generic import TemplateView
from .mixins import CustomLoginRequiredMixin #追加
# このviewのルーティングは「/myapp/Index」
class IndexView(CustomLoginRequiredMixin, TemplateView):
template_name = "myapp/index.html"
これで「next」パラメータは付与されなくなります。
以上です。
参考