Python

【Django必修スキル】投稿ユーザーのみしか閲覧できない様にするためのviews.pyの設定(objects.filterやorder_by)

関数ベースビューで、投稿した本人しか見れない様にする方法を紹介します。この手法は、Djangoで必ずと言っていいほど頻出する方法なので知らない方は、ぜひ知っておくといいかと思います。

models.pyにモデル名:「ABC」があり、その中にuserとtitleの2つのフィールドを持っているものとします。

models.py

class ABC(models.Model):

    user = models.ForeignKey(
        CustomUser,
        verbose_name='ユーザー',
        default=1,
        on_delete=models.PROTECT,
    )
    title = models.CharField(
        verbose_name='タイトル',
        max_length=30,
        null=True,
        blank=True,
    )

方法の紹介

以下のviews.pyの例で紹介します。

@login_required ←ログインユーザーのみがアクセス可能とする
def index_view(request):
    template_name = "index.html"
    object_list = ABC.objects.filter(user = request.user).order_by('-pk')
    return render(
        request,
        'index.html',
        {
            'object_list': object_list, ←テンプレート内でobject_listが使用できる
        }
    )

上記でobject_list = ABC.objects.filter(user = request.user).order_by(‘-pk’)の部分に注目してください。

この行は、object_list に➀.filter(user = request.user)と➁.order_by(‘-pk’)の二つの条件を加えて、リストデータを渡しています。

➀は、投稿ユーザーuserが、アクセスしているrequest.userと同じもののみ抜粋する。

➁は、pk(プライマリーキー)の順番に並び替える。

上記のように、条件をつなげて記載することで複数の条件を満たしたデーターリストを取得することができるようになるのです。

ABOUT ME
den
完全独学でWEBデザインを無謀にも挑戦している中年男。 工場勤務の会社員で3児の父。 チャレンジを忘れず、妻に怒られても心はおれず。 有益な情報を発信し、これを見ている人の為になればと思っています。
関連記事一覧