1. まずはtemplatesフォルダの中にcreate.htmlを作成します。ここではフォームボタンを入れています。{% csrf_token %}は入れないとセキュリティ上でエラーになってしまうため入れるようにしましょう。尚、.as_pとは、Djangoのタグで、pタグで囲むことを指します。
{% extends 'base.html' %} {% block content %} <form action ="" method="POST">{% csrf_token %} {{ form.as_p }} <input type="submit" value="作成する"> </form> {% endblock content %}
2. 次にアプリのurls.pyに今回のpathを追記しましょう。また今回新たに各pathに名前を付与しています。
from django.urls import path from .views import Todolist, TodoDetail, TodoCreate #TodCreateを追記 urlpatterns = [ path('list/', Todolist.as_view(), name = 'list'), path('detail/<int:pk>', TodoDetail.as_view(), name = 'detail'), path('create/', TodoCreate.as_view(), name = 'create') #追記 ]
3. 次に、views.pyにCreateのクラスを追記しましょう。template_name及びmodelに関しては、これまで通りですが、今回はcreate.html上で新たにフォームを設定しているため、fieldsとsuccess_urlを指定する必要があります。fieldsは、models.pyの対象モデルの中で、関連する変数をきちんと網羅させる必要があります。また、フォーム完了後の遷移先のURLを指定するためのsuccess_urlを入れます。ここでは今回urls.pyのpathで設定したurlの名前を入れます。また、reverse_lazy(URLに逆引きする)ですが、クラスではreverseではなく、reverse_lazyを使います。reverseは関数の際に使用します。
from django.shortcuts import render from django.views.generic import ListView, DetailView, CreateView #CreateViewを追記 from .models import TodoModel from django.urls import reverse_lazy class Todolist(ListView): tamplete_name = 'list.html' model = TodoModel class TodoDetail(DetailView): template_name = 'detail.html' model = TodoModel class TodoCreate(CreateView): #追記 template_name = 'create.html' model = TodoModel fields = ('title', 'note', 'priority', 'duedate') success_url = reverse_lazy('list')