前回の続きで、くじ引きアプリを作成していきます。
【前回のまとめ】
・新規登録画面や編集画面の登録者を自動的にログインユーザにする
【今回の作業】
・自分が投稿した内容だけをくじの結果とする
今回は自分が投稿した内容だけをくじの結果として表示したいと思いまます。
現在のコードのままだと誰かが作成した内容も表示されるようになっています。
設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。
自分が投稿した内容だけをくじの結果とする
【手順】
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ユーザの内容しか表示されない
確認した結果を動画に取りました。
以上で今回の目的である自分が投稿した内容だけをくじの結果とすることができました。
まだ完ぺきとは言えませんが、とりあえず一通りの機能は実装できました。
あとは見た目をよくしたり、パスワードのリセットなど色々機能を追加していこうと思います。
ありがとうございました。
【参考にしたサイトと本】

コメント