request.GET
とself.request.GET
の使い分け
関数ベースビュー(Function-Based View, FBV)
関数ベースビューでは、ビュー関数が引数として request
オブジェクトを受け取ります。クエリパラメータにアクセスする場合は、request.GET
を使用します。
例
def my_view(request):
name = request.GET.get('name') # FBVではrequest.GETを使う
クラスベースビュー(Class-Based View, CBV)
クラスベースビューでは、self.request
がクラスのインスタンス変数として設定されます。クラス内のメソッドからクエリパラメータにアクセスする際は、self.request.GET
を使います。
例
from django.views.generic import ListView
class MyListView(ListView):
def get(self, request, *args, **kwargs):
name = self.request.GET.get('name') # CBVではself.request.GETを使う
一貫性の観点から
クラスベースビューでのコードを一貫性のある形で書くには、self.request.GET
の使用が望ましいかも?これによりクラス内のどのメソッドからでも同じ方法でリクエストオブジェクトにアクセスでき、コードの可読性やメンテナンス性が向上します。
実際の例
私の実務のコードでは、クラスベースビュー内で request.GET
ではなく self.request.GET
を使用しています。
class ContractsListView(LoginRequiredMixin, OrderedListMixin, ListView):
def get(self, request, *args, **kwargs):
if not self.request.GET: # ここ!! if not request.GET とも書けてしまう
contract_search_data = self.request.session.get('contract_search_data', None)
このようにすることで、クラスベースビュー全体でリクエストオブジェクトへのアクセス方法が統一され、コードの可読性と保守性が向上します。