前回の続きで、くじ引きアプリを作成していきます。
【前回のまとめ】
・新規登録画面や編集画面の登録者を自動的にログインユーザにする
【今回の作業】
・自分が投稿した内容だけをくじの結果とする
今回は自分が投稿した内容だけをくじの結果として表示したいと思いまます。
現在のコードのままだと誰かが作成した内容も表示されるようになっています。
設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。
自分が投稿した内容だけをくじの結果とする
【手順】
1.views.pyを変更
ExecutionViewクラスを変更するため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 from django.core.exceptions import PermissionDenied 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] id = self.request.user.id #追加 pk = Tdl.objects.filter(author_id=id).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 = ['item'] #__all__' def form_valid(self, form): form.instance.author = self.request.user return super(CreateView, self).form_valid(form) class UpdateView(LoginRequiredMixin, generic.edit.UpdateView): model = Tdl fields = ['item'] #__all__' def dispatch(self, request, *args, **kwargs): obj = self.get_object() if obj.author != self.request.user: raise PermissionError('編集権限がありません') return super(UpdateView, self).dispatch(request, *args, **kwargs) class DeleteView(LoginRequiredMixin, generic.edit.DeleteView): model = Tdl success_url = reverse_lazy('tdl:index')
実行ボタンを押した時に、ログインユーザのデータだけを表示させたいため、以下のコードを追加・修正しました。
id = self.request.user.id:id変数へ現在ログインユーザを代入 Tdl.objects.filter(author_id=id).values_list(‘pk’, flat=True):フィルターを使って、データの投稿者とユーザのログインが一致したデータのみを抽出する。
2.tdl_execution.htmlを変更
今回の目的とは直接関係ありませんが、実行画面でログインユーザの表示をさせるため、共通テンプレートを変更します。
ファイル:myapptdl>tdl>templates>tdl>tdl_execution.html
{% extends 'layout.html' %} #修正 {% block content %} <h1>くじ引き結果</h1> <table class='table table-striped table-hover'> <tr> <th>内容</th> </tr> {% for tdl in object_list%} <tr> <td> {{ tdl.item }}</td> </tr> {% endfor %} </table> <div> <a href='JavaScript:history.back()'>戻る</a> </div> {% endblock %}
以上で設定は終わりなので、サーバを起動して確認します。
cd myapp python manage.py runserver
次の手順で確認していきます。
- 以下URLにブラウザでアクセスする
http://localhost:8000/tdl - adminユーザでログインする
- 「実行」ボタンをクリックする
- adminユーザの内容しか表示されない
- ログアウトして、testユーザでログイン
- 「実行」ボタンをクリックする
- testユーザの内容しか表示されない
確認した結果を動画に取りました。
以上で今回の目的である自分が投稿した内容だけをくじの結果とすることができました。
まだ完ぺきとは言えませんが、とりあえず一通りの機能は実装できました。
あとは見た目をよくしたり、パスワードのリセットなど色々機能を追加していこうと思います。
ありがとうございました。
【参考にしたサイトと本】
コメント