1. URL ディレクトリの文字列の利用の復習
Django の ListView などでテンプレートに返すデータをフィルタリングする際、urls.py で設定した URL ディレクトリの文字列を取得してそれを元にすることがあると思います。
下記の様な感じで get_queryset 関数で self.kwargs から値を取り出す感じですね。
# urls.py urlpatterns = [ path('<str:some_code>/', views.SomeData.as_view(), name="some_data"), ]
# views.py class SomeData(generic.ListView): ### 一部省略 ### def get_queryset(self): code = self.kwargs['some_code'] return SomeDataModel.objects.filter(some_code_column=code)
ただ、今回はそうではなく URL のパラメータを「ドメイン名.com/?キー=値&キー=値」の形式で取得してそれをデータ取得に使いたいと思います。
2. URL のパラメータの取得方法
1. self.request.GET.get(パラメータキー) で取得
get_queryset 関数をオーバーライドする際に self.request.GET.get(パラメータのキー) で取得できます。
例えば「http://127.0.0.1:8000/devicelist/?brand_nm=apple&category=laptop,phone」の様な URL の場合。
「?brand_nm=apple&category=laptop,phone」の部分をビューの処理に使いたいとします。
# views.py 内 get_queryset 関数 def get_queryset(self): brand = self.request.GET.get('brand_nm') return SomeDataModel.objects.filter(brand_nm=brand)
2. 値が一つだけの場合
値が一つだけの場合(brand_nm=apple)は「self.request.GET.get(キー)」でそのまま値が一つ取得できます。
print(self.request.GET.get('brand_nm')) # apple
3. 値が複数の場合
複数の値を「,」で繋げて URL に渡した場合(category=laptop,phone)は、「,」が含まれただけの一つの文字列になっています。
print(self.request.GET.get('category')) # laptop, phone
なので一旦 .split(',') を通してリストにしてあげる必要があります。
print(self.request.GET.get('category').split(',')) # ['laptop', 'phone'] print(self.request.GET.get('category').split(',')[0]) # laptop print(self.request.GET.get('category').split(',')[1]) # phone
4. 値を指定していない場合
URL で渡していないキーを指定すると None が返ってきます。
print(self.request.GET.get('product_type')) # None