0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoのLoginRequiredMixinを継承したViewに未ログインでアクセスしたときにリダイレクトされるログインURLに「next」パラメータを付与させないようにする

Last updated at Posted at 2023-06-16

結論

LoginRequiredMixinを継承したカスタムクラスを作成し、handle_no_permission関数をオーバーライドしてリダイレクト部分を実装することでnextパラメータを付与させないようにできます。

前提

  • 使用モジュールの各バージョンは以下です
    • Django 3.2.19

現象確認

djangoでLoginRequiredMixinを継承したViewは、未ログインでアクセスするとログインURLにリダイレクトされます。この時、ログイン後にリダイレクト前のViewに帰ってこれるようにURLに「next」のクエリパラメータが付与されています。

project/config.py

# 未ログインでLoginRequiredMixin継承したViewにアクセスしたときにリダイレクトされるURL
LOGIN_URL = '/loginform'

myapp/views.py
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"

nextパラメータ01.png

原因

LoginRequiredMixinの仕様によるものです。

原因を踏まえての解決策

LoginRequiredMixinの仕様そのものを変えてしまうのは難しいと思います。そこでLoginRequiredMixinを継承したMixinクラスを用意してカスタマイズをしていきます。
より具体的にはMixinカスタマイズクラスでhandle_no_permission関数をオーバーライドして「next」パラメータを付与させないようにします。

手順

アプリフォルダの中に新規でpyファイル用意して以下のカスタムMixinクラスを作成します。

myapp/mixins.py
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クラスを継承します。

myapp/views.py
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」パラメータは付与されなくなります。

nextパラメータ02.png

以上です。

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?