前回の続きで、くじ引きアプリを作成していきます。
【前回のまとめ】
・ユーザがログイン時に自分の作成した内容だけを表示できるようにする
【今回の作業】
・新規登録画面や編集画面の登録者を自動的にログインユーザにする
今回は、新規登録の時や編集をする時に、ユーザを選択する項目がありますが、ユーザを選択する必要自体はないと思いますので、その項目を削除し、現在ログインしているユーザを自動的に入力するようにします。
設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。
新規登録画面や編集画面の登録者を自動的にログインユーザにする
まずは、新規登録画面を変更するためviews.pyを変更します。
【手順】
1.views.pyを変更
新規登録画面を編集するため、vies.pyのCreateViewクラスとUpdateViewクラスを変更します。
ファイル: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] 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 = ['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')
●CreateViewクラス
fields変数を[‘item’]に変更しています。
そして「def form_valid(self, form):」メソッドをオーバライドします。
「form.instance.author」変数に「self.request.user」を挿入しています。
「self.request.user」は、ログイン中のユーザのことです。
そのユーザを投稿者ユーザにしています。
●UpdateViewクラス
fields変数を[‘item’]に変更しています。
次にdispatchメソッドで、データを作成したユーザとログインユーザが同じでない場合はエラーを出力するようにしています。
※今回のプログラムでは自分の登録した内容しか表示されませんが、念のために入れておきます。
if obj.author != self.request.user:
raise PermissionError(‘編集権限がありません’)
以上で設定は終わりなので、サーバを起動して確認します。
cd myapp python manage.py runserver
次の手順で確認していきます。
- 以下URLにブラウザでアクセスする
http://localhost:8000/tdl - 新規作成をクリックする
- 「Item」しか表示されていないことを確認する
- 「20200814新規作成」を登録する
- 「20200814新規作成」の編集をクリックする
- 「Item」しか表示されていないことを確認する
- ログインしたユーザで登録されているかを確認するため、以下URLにブラウザでアクセスする
http://localhost:8000/admin - 「Tdls」をクリックして、「20200814新規作成」をクリックする
- 「Author」がadminになっていることを確認する
確認した結果を動画に取りました。
以上で今回の目的である新規登録画面や編集画面の登録者を自動的にログインユーザにすることができました。
次回は自分が作成した内容だけをくじ引きできるようにしたいと思います。
ありがとうございました。
【参考にしたサイトと本】
コメント