Django Python

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

今回は「[Django初心者]DjangoでTodoリストを作成する」の第6回として、Todoの新規作成画面を作成し、実際にtodoを追加していこうと思います。

前回は、削除機能を追加しました。

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

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
    │       ├── delete.html
    │       ├── detail.html
    │       ├── list.html
    │       └── update.html
    ├── tests.py
    ├── urls.py
    └── views.py

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

構成が違う方は前回までの記事を確認してください。

urls.pyに追記

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

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

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

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'),
    path('delete/<int:pk>/', TodoDelete.as_view(), name='delete'),
    path('create/', TodoCreate.as_view(), name='create'),
]

前回までと同じなので、解説は省略します。

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')


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

    success_url = reverse_lazy('list')
    

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

    success_url = reverse_lazy('list')

fields」については、前の記事で解説しているので、そちらの方を参考にしください!

create.htmlの作成と編集

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

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

 touch todo/templates/todo/create.html

追加されているか確認しましょう。

├── 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
    │       ├── create.html
    │       ├── delete.html
    │       ├── detail.html
    │       ├── list.html
    │       └── update.html
    ├── tests.py
    ├── urls.py
    └── views.py

しっかり追加されているのが確認できますね。

それでは中身を編集していきましょう。

次のように編集してください。

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

ここも前回までに説明したことと同じものしかありませんね。

実際に表示させたときに、どのような対応づけられているか照らし合わせながら確認しください。

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 ">
    <div>
        <p class="new-btn"><a href="{% url 'create' %}" class="btn btn-success btn-lg" tabindex="-1" role="button" aria-disabled="true">新規作成</a></p>
    </div>
    {% 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>
                <p class="btn-content"><a href="{% url 'delete' list.pk %}" class="btn btn-danger" tabindex="-1" role="button" aria-disabled="true">削除</a></p>
            </div>
        </div>
    <hr>
    {% endfor %}
</div>
{% endblock content %}

これで準備は完了です。

新規作成画面の表示とtodoの作成

それでは早速新規作成画面を表示させてみましょう。

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

そうするとこのように表示されます。

新規作成」ボタンを押してください。

そうするとこのような画面が表示されるはずです。

編集画面と同じような見た目をしていますね。

それでは早速、それぞれ中身を入力してtodoを追加しましょう。

中身を入力できたら、「保存」ボタンを押してください。

一覧表示画面に移動して、先ほど追加したものが表示されていれば完璧です!

これで新規作成画面の作成とtodoの追加は完了です。

お疲れ様でした!

最後に

今回は「DjnagoでTodoリストを作成する」の第6回として、Todoの新規作成画面を作成して、todoの追加するところまでやってきました。

今回で「DjnagoでTodoリストを作成する」はひとまず完了です!

本当にお疲れ様でした!

今回の講座を通してDjangoへの理解が深まっていれば僕は嬉しいです。

今後もPythonやDjango、機械学習についての記事を書いていくので、よければ見ていってください。

続き更新しました!

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

それでは!

-Django, Python
-,