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

lottery-146318_1280.png Django

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

【前回のまとめ】

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

【今回の作業】

・自分が投稿した内容だけをくじの結果とする

今回は自分が投稿した内容だけをくじの結果として表示したいと思いまます。
現在のコードのままだと誰かが作成した内容も表示されるようになっています。

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

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

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

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

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

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

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

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

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

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

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

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

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

自分が投稿した内容だけをくじの結果とする

【手順】

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

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

  1. 以下URLにブラウザでアクセスする
    http://localhost:8000/tdl
  2. adminユーザでログインする
  3. 「実行」ボタンをクリックする
  4. adminユーザの内容しか表示されない
  5. ログアウトして、testユーザでログイン
  6. 「実行」ボタンをクリックする
  7. testユーザの内容しか表示されない

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

以上で今回の目的である自分が投稿した内容だけをくじの結果とすることができました。

まだ完ぺきとは言えませんが、とりあえず一通りの機能は実装できました。

あとは見た目をよくしたり、パスワードのリセットなど色々機能を追加していこうと思います。

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

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

[Django]QuerySetのfilterメソッドの使い方まとめ

Django データベース操作 についてのまとめ

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

コメント

タイトルとURLをコピーしました