Django クラスベース汎用ビューのURLにプライマリーキーを含めたくない

UpdateViewなどのクラスベース汎用ビューのURLパターンは、下記のようにプライマリーキー(pk)を含めて定義してViewに渡す方法がよく紹介されています。そしてpkを指定しないと通常エラーが発生します。

path('update/<int:pk>', views.Update.as_view(), name="update")

しかし、URLのpk部分を手修正して意図しないデータにアクセス出来ないようにするため別途制限を書かないといけないかもしれません。

そこで、そもそもURLにpkを含めないようにした方が余計な心配もしなくてすみそうです。

修正箇所はurls.pyとview.pyです。Viewはモデルから1つのオブジェクトを返すget_objectメソッドをオーバーライドしています。以下の例ではログインユーザーIDを使ってUserモデルオブジェクトを取得しています。

これで/update/にアクセスするとログインユーザーのUserモデルにアクセスでき、URLにプライマリーキーも含めずにすみます。

urls.py

path(‘update/’, views.Update.as_view(), name=”update”)

 

views.py

class Update(UpdateView): 
    model = User

    def get_object(self, queryset=None):
        return User.objects.get(id=self.request.user.id)