Django Python

[Django初心者]DjangoでTodoリストを作成する 修正編

今回は「[Django初心者]DjangoでTodoリストを作成する」で作成したTodoリストのコードをより良いものに修正していきたいと思います。

前回

第1回

1つずつ確認していくので、一緒にコードをアップデートしていきましょう!

settings.pyの編集

まずは「settings.py」を編集していきます。

# 修正前
SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# 修正後
try:
    from .local_settings import *
except ImportError:
    pass

SECRET_KEY」とは、暗号化やハッシュ化で用いられる秘密鍵を指定するもので、他の人に知られてはいけません。

そのため、今回は毎回ランダムなキーを生成してくれるようにしました。

この部分を修正したら、「settings.py」と同じ階層に、「generate_secretkey__settings.py」を追加していきます。

manage.py」がある階層で次のコマンドをターミナルで実行します。

mkdir config/generate_secretkey__settings.py

そして追加した「generate_secretkey__settings.py」に次のように追記してください。

from django.core.management.utils import get_random_secret_key

secret_key = get_random_secret_key()
text = 'SECRET_KEY = \'{0}\''.format(secret_key)
print(text)

それでは「SECRET_KEY」を作成していきます。

manage.py」が配下にある階層で、次のコマンドを実行してください。

python config/generate_secretkey__settings.py > config/local_settings.py

そうすると「settings.py」と同じ階層に、「local_settings.py」が作成され、中に「SECRET_KEY」があるのが確認できます。

これで「settings.py」の編集は終わりです。

urls.pyの編集(プロジェクト)

次に「config」配下の「urls.py」を編集していきます。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('todo/', include('todo.urls')),
]

色がついているところを以下のように変更してください。

path('', include('todo.urls')),

このようにすることで、「runserver」した時にそのまま「todo」アプリの「urls.py」に繋げることができます。

urls.pyの編集(アプリ)

では次にアプリの方の「urls.py」を編集していきましょう。

todo」配下の 「urls.py」を開いてください。

from django.urls import path
from .views import TodoList, TodoDetail, TodoUpdate, TodoDelete, TodoCreate

app_name = 'todo'

urlpatterns = [
    path('list/', TodoList.as_view(), name='todo_list'),
    path('detail/<int:pk>/', TodoDetail.as_view(), name='detail'),
    path('update/<int:pk>/', TodoUpdate.as_view(), name='update'),
    path('delete/<int:pk>/', TodoDelete.as_view(), name='delete'),
    path('create/', TodoCreate.as_view(), name='create'),
]

色がついているところを次のように編集してください。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.TodoList.as_view(), name='todo_list'),
    path('todo_detail/<int:pk>/', views.TodoDetail.as_view(), name='todo_detail'),
    path('todo_update/<int:pk>/', views.TodoUpdate.as_view(), name='todo_update'),
    path('todo_delete/<int:pk>/', views.TodoDelete.as_view(), name='todo_delete'),
    path('todo_create/', views.TodoCreate.as_view(), name='todo_create'),
]

view.py」からの読み込み部分をスッキリさせ、パスもわかりやすくしました。

views.pyの編集

次に「views.py」の編集をしていきます。

todo」配下の「views.py」を開いて以下のように変更してください。

from django.views import generic
from .models import TodoModel
from django.urls import reverse_lazy


class TodoList(generic.ListView):
    template_name = 'todo/todo_list.html'
    model = TodoModel

    context_object_name = 'todos'


class TodoDetail(generic.DetailView):
    template_name = 'todo/todo_detail.html'
    model = TodoModel


class TodoUpdate(generic.UpdateView):
    template_name = 'todo/todo_update.html'
    model = TodoModel
    fields = ('title', 'content', 'deadline')
    success_url = reverse_lazy('todo_list')


class TodoDelete(generic.DeleteView):
    template_name = 'todo/todo_delete.html'
    model = TodoModel

    success_url = reverse_lazy('todo_list')


class TodoCreate(generic.CreateView):
    template_name = 'todo/todo_create.html'
    model = TodoModel
    fields = ('title', 'content', 'deadline')

    success_url = reverse_lazy('todo_list')

これはHTMLファイルでデータを1つずつ取り出すときの「object_list」の部分を「todos」で取り出すことができるようにする設定です。

後で実際にその変更を確認しましょう。

HTMLファイルの名前の変更

HTMLファイルの名前をそれぞれ次のように変更してください。

create.html」→「todo_create.html

delete.html」→「todo_delete.html

detail.html」→「todo_detail.html

list.html」→「todo_list.html

update.html」→「todo_update.html

これで視覚的にわかりやすくなりましたね。

HTMLファイルの中身の編集

では最後にHTMLファイルの中身を一気に編集していきましょう。

ここはコピペで問題ないです。

todo_create.html」を以下のように編集してください。

{% extends 'base.html' %}

{% block content %}
    <div class="jumbotron jumbotron-fluid">
      <div class="container">
        <h1 class="display-4">新規作成フォーム</h1>
        <p class="lead">新しいTodoを作成しましょう</p>
      </div>
    </div>
    <div class="container">
        <form action="" method="POST">
            {% csrf_token %}
            {{ form.as_p }}
        <input type="submit" value="保存">
    </form>
    </div>
    <div class="container">
        <p class="btn-content"><a href="{% url 'todo:todo_list' %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">一覧に戻る</a></p>
    </div>
{% endblock content %}

todo_delete.html」を以下のように編集してください。

{% extends 'base.html' %}

{% block content %}
    <div class="jumbotron jumbotron-fluid">
      <div class="container">
        <h1 class="display-4">削除フォーム</h1>
        <p class="lead">やることを削除しましょう</p>
      </div>
    </div>
    <div class="container">
        <form action="" method="POST">
        {% csrf_token %}
        <h1>{{ object.title }}</h1>
        <p>{{ object.content }}</p>
        <p>{{ object.deadline }}</p>
        <p>本当に削除しますか?</p>
        <input type="submit" value="削除" onclick="return confirm('本当に削除しますか?');">
    </form>
    </div>
    <div class="container">
        <p class="btn-content"><a href="{% url 'todo:todo_list' %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">一覧に戻る</a></p>
    </div>
{% endblock content %}

todo_detail.html」を以下のように編集してください。

{% extends 'base.html' %}

{% block content %}
    <div class="jumbotron jumbotron-fluid">
      <div class="container">
        <h1 class="display-4">詳細</h1>
        <p class="lead">詳細が見れます</p>
      </div>
    </div>
    <div class="container">
        <h1>{{ object.title }}</h1>
        <p>{{ object.content }}</p>
        <p>{{ object.deadline }}</p>
    </div>
    <div class="container">
        <p class="btn-content"><a href="{% url 'todo:todo_list' %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">一覧に戻る</a></p>
    </div>
{% endblock content %}

todo_list.html」を以下のように編集してください。

{% extends 'base.html' %}
{% load static %}

{% block header %}
<link rel="stylesheet" href="{% static 'todo/css/list.css' %}">
{% endblock header %}

{% block content %}
<div class="jumbotron jumbotron-fluid">
    <div class="container">
        <h1 class="display-4">TodoList</h1>
        <p class="lead">やることを記入しましょう</p>
    </div>
</div>
<div class="container ">
    <div>
        <p class="new-btn"><a href="{% url 'todo:todo_create' %}" class="btn btn-success btn-lg" tabindex="-1" role="button" aria-disabled="true">新規作成</a></p>
    </div>
    {% for todo in todos %}
        <div class="one_box">
            <h1>{{ todo.title }}</h1>
            <h4>{{ todo.deadline }}</h4>
            <div class="btns">
                <p class="btn-content"><a href="{% url 'todo:todo_detail' todo.pk %}" class="btn btn-primary "tabindex="-1" role="button" aria-disabled="true">詳細</a></p>
                <p class="btn-content"><a href="{% url 'todo:todo_update' todo.pk %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">編集</a></p>
                <p class="btn-content"><a href="{% url 'todo:todo_delete' todo.pk %}" class="btn btn-danger" tabindex="-1" role="button" aria-disabled="true">削除</a></p>
            </div>
        </div>
    <hr>
    {% endfor %}
</div>
{% endblock content %}

ここでは先ほど「views.py」で編集したfor文でデータ一覧を取り出すときに名前の指定を「object_list」から「todos」に変更できているを確認できます。

todo_update.html」を以下のように編集してください。

{% extends 'base.html' %}

{% block content %}
    <div class="jumbotron jumbotron-fluid">
      <div class="container">
        <h1 class="display-4">編集フォーム</h1>
        <p class="lead">Todoを編集しましょう</p>
      </div>
    </div>
    <div class="container">
        <form action="" method="POST">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="更新"></input>
        </form>
    </div>
    <div class="container">
        <p class="btn-content"><a href="{% url 'todo:todo_list' %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">一覧に戻る</a></p>
    </div>
{% endblock content %}

これで完了です!

リンクの部分につけられた「todo:」の部分は「todoアプリのurls.py」をみてください、という意味です。

変更の確認

ではブラウザで変更しても動作に変わりはない確認していきましょう!

terminal」で次のコマンドを実行してください。

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

動作を確認してみて問題なければ完璧です!

何か動きがおかしければ、記事を見直したり、TwitterのDMかここのコメントで教えてください!

最後に

今回は「[Django初心者]DjangoでTodoリストを作成する」で作成した「Todoリスト」のコードをアップデートしてきました。

続き...

それでは!

-Django, Python
-,