Djangoでくじ引きアプリを作ってみる_part11

前回の続きで、くじ引きアプリを作成していきます。

【前回のまとめ】

・ユーザがログイン時にだけ投稿や編集・削除できるようにする

【今回の作業】

・ユーザがログイン時に自分の作成した内容だけを表示できるようにする

現在の状態ではログインしなくても投稿ボタンなどが表示されています。
そしてボタンを押すとログイン画面に遷移するようにしましたが、そもそもすべての内容が表示されているので、ログイン時に自分の作成した内容だけを表示できるようにする

設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。

Djangoでくじ引きアプリを作ってみる_part1

Djangoでくじ引きアプリを作ってみる_part2

Djangoでくじ引きアプリを作ってみる_part3

Djangoでくじ引きアプリを作ってみる_part4

Djangoでくじ引きアプリを作ってみる_part5

Djangoでくじ引きアプリを作ってみる_part6

Djangoでくじ引きアプリを作ってみる_part7

Djangoでくじ引きアプリを作ってみる_part8

Djangoでくじ引きアプリを作ってみる_part9

Djangoでくじ引きアプリを作ってみる_part10

ユーザがログイン時に自分の作成した内容だけを表示できるようにする

【手順】

1.tdl_list.htmlを修正

一覧画面の新規作成ボタン、実行ボタン、編集リンク、削除リンクをログイン時にだけ表示するように修正します。

ファイル:myapptdl>tdl>templates>tdl>tdl_list.html

コード:

{% extends 'layout.html' %}
{% block content %}
    <h1>くじ引き内容</h1>

{% if user.is_authenticated %} #追加
    <table class='table table-striped table-hover'>
        <tr>
            <th>内容</th><th>編集</th><th>削除</th>
        </tr>
        {% for tdl in object_list%}
        <tr>
            <td> {{ tdl.item }}</td>
            <td> <a href='{% url "tdl:update" tdl.id %}'>編集</a> </td>
            <td> <a href='{% url "tdl:delete" tdl.id %}'>削除</a> </td>
        </tr>
        {% endfor %}
    </table>

        <div>
            <a href='{% url "tdl:create" %}' class="btn btn-primary">新規作成</a>
            <a href='{% url "tdl:execution" %}' class="btn btn-secondary">実行</a>
        </div>

#以下を追加-------
{% else %} 
    <table class='table table-striped table-hover'>
        <tr>
            <th>内容</th>
        </tr>
        <tr>
            <td>サンプル1</td>
        </tr>
        <tr>
            <td>サンプル2</td>
        </tr>
    </table>
{% endif %}
#ここまで-------
{% endblock %}

ここでは、ログイン時にだけ新規作成ボタン、実行ボタン、編集リンク、削除リンクを表示させるため、if文を利用します。

以下のコードは、ログイン時にだけ次のコードを実行します。

{% if user.is_authenticated %}

{% else %} 以降のコードは、未ログイン時に表示されます。
未ログインのユーザには、サンプルの内容を表示するようにコードを追加しています。

次にログインユーザの内容だけを表示させるため、views.pyを修正します。

2.views.pyを修正

次はログイン時にだけ、各操作ができるようにコードを修正していきます。

ファイル:myapptdl>tdl>views.py

コード:

from django.urls import reverse_lazy
from django.views import generic
from .models import Tdl
import random
from django.contrib.auth.mixins import LoginRequiredMixin

class IndexView(generic.ListView):
   model = Tdl

#以下を追加-----
   def get_queryset(self):
       id = self.request.user.id
       return Tdl.objects.filter(author_id=id)

#ここまで----
class ExecutionView(LoginRequiredMixin, generic.ListView):
  model = Tdl
  template_name = 'tdl/tdl_execution.html'

  def get_queryset(self):
#    return Tdl.objects.order_by('?')[:1]
    pk = Tdl.objects.values_list('pk', flat=True)
    pk_list = list(pk)
    pk_random = random.choice(pk_list)
    queryset = Tdl.objects.filter(pk=pk_random)

    return queryset

class CreateView(LoginRequiredMixin, generic.edit.CreateView):
  model = Tdl
  fields = '__all__'

class UpdateView(LoginRequiredMixin, generic.edit.UpdateView):
  model = Tdl
  fields = '__all__'

class DeleteView(LoginRequiredMixin, generic.edit.DeleteView):
  model = Tdl
  success_url = reverse_lazy('tdl:index')

views.pyではログインユーザが作成した内容だけ表示させるためのコードを追記します。

id = self.request.user.id:ログインしているユーザIDをid変数へ代入する

return Tdl.objects.filter(author_id=id):ログインユーザIDと内容投稿者のIDが一致しているものだけを抽出する

【参考URL】

Django
The web framework for perfectionists with deadlines.
DjangoのListViewで権限に応じてを表示するリストを変える方法 | 知的好奇心
DjangoのListViewでsuperuserはすべてのリストを表示し、一般ユーザは自分のリストのみ表示する方法をご紹介します。条件 Django 2.1.3 Python 3.7.0ListViewによる一覧表示ListViewによる...

以上で設定は終わりなので、サーバを起動して確認します。

 
cd myapp 
python manage.py runserver

次の手順で確認していきます。

  1. 以下URLにブラウザでアクセスする
    http://localhost:8000/tdl
  2. 一覧画面にサンプルが表示されている(未ログイン状態)
  3. Loginをクリックして、ログインする
  4. 一覧の内容が変わっていることを確認する
  5. ログアウトして、一覧画面に戻る
  6. 別のユーザでログインする
  7. 別のユーザの内容が表示される

確認した結果を動画に取りました。

以上で今回の目的であるユーザがログイン時に自分の作成した内容だけを表示することができました。

次回は新規登録や編集画面の登録者を自動的にログインユーザにするようにしたいと思います。

ありがとうございました。

【参考にしたサイトと本】

#08:ログイン時だけ投稿・編集・削除リンクを表示

Python Django3超入門 (日本語) 単行本 – 2020/6/13

コメント

タイトルとURLをコピーしました