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

Pocket

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

【前回のまとめ】

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

【今回の作業】

・新規登録画面や編集画面の登録者を自動的にログインユーザにする

今回は、新規登録の時や編集をする時に、ユーザを選択する項目がありますが、ユーザを選択する必要自体はないと思いますので、その項目を削除し、現在ログインしているユーザを自動的に入力するようにします。

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

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

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

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

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

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

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

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

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

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

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

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

新規登録画面や編集画面の登録者を自動的にログインユーザにする

まずは、新規登録画面を変更するため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

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

  1. 以下URLにブラウザでアクセスする
    http://localhost:8000/tdl
  2. 新規作成をクリックする
  3. 「Item」しか表示されていないことを確認する
  4. 「20200814新規作成」を登録する
  5. 「20200814新規作成」の編集をクリックする
  6. 「Item」しか表示されていないことを確認する
  7. ログインしたユーザで登録されているかを確認するため、以下URLにブラウザでアクセスする
    http://localhost:8000/admin
  8. 「Tdls」をクリックして、「20200814新規作成」をクリックする
  9. 「Author」がadminになっていることを確認する

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

以上で今回の目的である新規登録画面や編集画面の登録者を自動的にログインユーザにすることができました。

次回は自分が作成した内容だけをくじ引きできるようにしたいと思います。

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

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

#09:ログインユーザー名を、作成・編集に使おう

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

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です