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

Django

今回は「[Django初心者]DjangoでTodoリストを作成する」の第4回として、Todoの編集画面を作成していきます。

前回は、詳細画面の表示をしました。

まだそこまでやれていない人はぜひ前回までをみてください!

GitHubはこちらです。

cardene777/todo
todo blog. Contribute to cardene777/todo development by creating an account on GitHub.

GitHubの使い方がわからない方はこちらの記事を参考にしてください!

それでは早速やっていきましょう!

構成の確認

まずは前回まで作成した構成の確認枯らしていきましょう。

├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── templates
│   └── base.html
└── todo
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── __init__.py
    ├── models.py
    ├── static
    │   └── todo
    │       └── css
    │           └── list.css
    ├── templates
    │   └── todo
    │       ├── detail.html
    │       └── list.html
    ├── tests.py
    ├── urls.py
    └── views.py

このような構成になっているでしょうか?

どこか違う方は第1回第2回, 第3回を見直すか、コメントに書き込むかTwitterでDMを送ってください!

urls.pyに追記

まずは「urls.py」にパスを通すことからしていきましょう。

todoアプリケーションの方の「urls.py」に追記してください。

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

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

前回追加したものとほとんど同じですね。

<int:pk>」については前回の記事で解説しているので、よければそちらを参考にしください。

vies.pyに追記

だんだん手順に慣れてきたと思います。

今回以降の手順はほとんど前回と同じなので、理解しやすいと思います。

views.py」に次のように追記してください。

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


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


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


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

前回までと比べ少し長くなっていますね。

新しく出てきた部分のみ解説していきます。

fields = (‘title’, ‘content’, ‘deadline’)」では、編集するフィールドを指定しています。

どこにそのフィールドが定義されているかというと、「models.py」です。

ちょっとみてみましょう。

from django.db import models
from django.utils import timezone


class TodoModel(models.Model):
    class Meta:
        verbose_name = "Todoリスト"
        verbose_name_plural = 'Todoリスト'

    title = models.CharField(
        verbose_name="タイトル",
        max_length=50,
    )
    content = models.TextField(
        verbose_name="内容"
    )
    deadline = models.DateTimeField(
        verbose_name="期日",
        default=timezone.now
    )

    def __str__(self):
        return self.title

models.py」に先ほど指定した通りにフィールドが定義されていますね。

もし編集させたくないものがあれば「views.py」で指定しなければ問題ないです。

success_url = reverse_lazy(‘list’)」では、編集完了ボタンを押したらどこに遷移させるかを定義しています。

今回は「‘list’」と指定しているように、一覧表示画面に遷移するようにしています。

update.htmlの作成と編集

まずは、「update.html」を作成していきましょう。

ターミナルで次のコマンドを実行してください。

 touch todo/templates/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 'list' %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">一覧に戻る</a></p>
    </div>
{% endblock content %}

新しく出てきた部分のに解説していきます。

<form action="" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="更新"></input>
</form>

この部分では編集フィールドを作成しています。

form」とは、お問い合わせフォームやサインアップするときに、自分の情報を入力するような場所を作成してくれるものです。

{% csrf_token %}」とは、セキュリティに関するものです。

安全に通信を行う上で必要なものという理解で問題ないです。

詳しく知りたい方はこちらなどを参考にしてください。

{{ form.as_p }}

ここでは、先ほど「views.py」でしてしたフィールドをHTMLのpタグで囲んだ状態で表示するということをしています。

後で編集画面を実際に見るので、そのときに確認してください。

list.htmlに追記

前回同様、「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 ">
    {% for list in object_list %}
        <div class="one_box">
            <h1>{{ list.title }}</h1>
            <h4>{{ list.deadline }}</h4>
            <div class="btns">
                <p class="btn-content"><a href="{% url 'detail' list.pk %}" class="btn btn-primary "tabindex="-1" role="button" aria-disabled="true">詳細</a></p>
                <p class="btn-content"><a href="{% url 'update' list.pk %}" class="btn btn-info" tabindex="-1" role="button" aria-disabled="true">編集</a></p>
            </div>
        </div>
    <hr>
    {% endfor %}
</div>
{% endblock content %}

これで準備は完了です。

編集画面の表示

それでは早速編集画面を表示させてみましょう。

こちらにアクセスしてください。

http://127.0.0.1:8000/list/

このような画面が表示されていると思います。

それでは、どのTodoでも良いので「編集」というボタンをクリックしてください。

こんな感じの画面が表示されていれば完璧です。

登録していた情報がしっかり表示されていますね。

そして先ほどの「form」はこのようなフィールドを作成してくれます。

そして縦にしっかり並べられているのは、「{{ form.as_p }}」により、pタグでそれぞれのフィールドを囲んでくれているためです。(指定しないと、全て横並びになってしまいます。)

それではせっかくなので、どこか好きなように書き換えてみましょう!

書き換えたら「更新」というボタンをクリックしてください。

そうすると一覧表示画面に戻れると思うので、そのまま先ほど編集したデータの「詳細」ボタンをクリックしてください。

しっかり更新されているのが確認できれば無事今回の手順は完璧です!

お疲れ様でした!

最後に

今回は「DjnagoでTodoリストを作成する」の第4回として、Todoの編集画面を作成して、表示するところまでやってきました。

続き…

質問などがあればコメントするか、下のアイコンからTwitterのDMまで送ってください!

それでは!

コメント

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