前回の続きで、くじ引きアプリを作成していきます。
【前回のまとめ】
・ユーザがログイン時にだけ投稿や編集・削除できるようにする
【今回の作業】
・ユーザがログイン時に自分の作成した内容だけを表示できるようにする
現在の状態ではログインしなくても投稿ボタンなどが表示されています。
そしてボタンを押すとログイン画面に遷移するようにしましたが、そもそもすべての内容が表示されているので、ログイン時に自分の作成した内容だけを表示できるようにする
設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。
ユーザがログイン時に自分の作成した内容だけを表示できるようにする
【手順】
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】
https://docs.djangoproject.com/ja/3.1/topics/class-based-views/generic-display/

以上で設定は終わりなので、サーバを起動して確認します。
cd myapp python manage.py runserver
次の手順で確認していきます。
- 以下URLにブラウザでアクセスする
http://localhost:8000/tdl - 一覧画面にサンプルが表示されている(未ログイン状態)
- Loginをクリックして、ログインする
- 一覧の内容が変わっていることを確認する
- ログアウトして、一覧画面に戻る
- 別のユーザでログインする
- 別のユーザの内容が表示される
確認した結果を動画に取りました。
以上で今回の目的であるユーザがログイン時に自分の作成した内容だけを表示することができました。
次回は新規登録や編集画面の登録者を自動的にログインユーザにするようにしたいと思います。
ありがとうございました。
【参考にしたサイトと本】
コメント