この記事では、クラスベースビューのCreateView, UpdateView, UpdateViewの利用方法について記述していく。
CreateViewを用いたレコードの追加
CreateViewの基本的な使い方を記述する。
models.pyは以下のように定義する。
(Schoolクラスにget_absolute_urlメソッドを定義しておかないと、CreateView, UpdateViewでcreate, update成功時に遷移先がなくなりエラーとなる。
詳細はこちらの記事参照)
- models.py
from django.urls import reverse
class School(models.Model):
name = models.CharField(max_length=256)
principal = models.CharField(max_length=256)
location = models.CharField(max_length=256)
def __str__(self):
return self.name
def get_absolute_url(self):
# create, update成功時の遷移先を定義
return reverse("basic_app:detail", kwargs={'pk': self.pk})
class Student(models.Model):
name = models.CharField(max_length=256)
age = models.PositiveIntegerField()
school = models.ForeignKey(School, related_name='students', on_delete='CASCADE')
def __str__(self):
return self.name
次に、views.pyの設定を行う。
CreateViewを継承したクラスを作成してmodelを設定する。
(このmodelが今回データを挿入するモデル)
- views.py
from . import models
class SchoolCreateView(CreateView):
fields = ('name', 'principal', 'location')
# 画面のformに表示する項目
model = models.School
# データ挿入の対象とするモデル
urls.pyには、以下のように記述する。
- urls.py
from basic_app import views
app_name = 'basic_app'
urlpatterns = [
path('create', views.SchoolCreateView.as_view(), name='create'),
]
テンプレートファイルはデフォルト(template_nameを指定しない場合)で、templates/アプリ名/モデル名_form.htmlにアクセスされる。以下のように記述した。
- school_form.html(./templates/basic_app/school_form.html)
{% block body_block %}
<h1>
Create School
</h1>
<form class="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-primary" value="submit">
</form>
{% endblock %}
Djangoを立ち上げて画面を表示すると以下のように表示される。
値を入れて、submitボタンを押すと実際に値が挿入される。
UpdateViewを用いたレコードの更新
次に、UpdateViewを用いてレコードを更新していく方法について詳述していく
- models.py
from django.urls import reverse
class School(models.Model):
name = models.CharField(max_length=256)
principal = models.CharField(max_length=256)
location = models.CharField(max_length=256)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("basic_app:detail", kwargs={'pk': self.pk})
class Student(models.Model):
name = models.CharField(max_length=256)
age = models.PositiveIntegerField()
school = models.ForeignKey(School, related_name='students', on_delete='CASCADE')
def __str__(self):
return self.name
views.pyは簡単に記載する。
- views.py
UpdateView
)
from . import models
class SchoolUpdateView(UpdateView):
fields = ('name', 'principal')
# 更新対象のフィールド
model = models.School
urls.pyは以下のように<int:pk>としてpkで値を取得できるようにする。
- urls.py
from basic_app import views
app_name = 'basic_app'
urlpatterns = [
path('update/<int:pk>', views.SchoolUpdateView.as_view(), name='update'),
]
テンプレートはデフォルトでtemplates/アプリ名/モデル名_form.htmlが使用される。
- school_form.html(./templates/basic_app/school_form.html)
{% block body_block %}
<h1>
{% if not form.instance.pk %}
Create School
{% else %}
Update School
{% endif %}
</h1>
<form class="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-primary" value="submit">
</form>
{% endblock %}
Djangoを動かして、アクセスすると以下のような画面になる。
値を変更してsubmitボタンを押すと実際にレコードが変更されます、
DeleteViewを用いたレコードの削除
次に、DeleteViewを用いてレコードを削除する方法について詳述していく
まず、modelは上述したCreateView, UpdateViewと同じように定義する。
views.pyには、以下のようにmodelの設定とsuccess_urlを設定する。
success_urlの設定にはreverse_lazyを用いる。
- views.py
DeleteView
)
from . import models
class SchoolDeleteView(DeleteView):
model = models.School
success_url = reverse_lazy('basic_app:list')
urls.pyには以下のように記述する。
- urls.py
from basic_app import views
app_name = 'basic_app'
urlpatterns = [
path('delete/<int:pk>', views.SchoolDeleteView.as_view(), name='delete'),
]
最後に、templateは以下のように記述する。
DeleteViewのテンプレートはデフォルト(template_nameに指定しない場合)で、./templates/アプリ名/モデル名_confirm_delete.htmlとなる。
- school_confirm_delete.html
{% block body_block %}
<h1>Delete {{ school.name }}</h1>
<form class="" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-danger" value="Delete">
<a href="{% url 'basic_app:detail' pk=school.pk %}">Cancel</a>
</form>
{% endblock %}
実行すると以下のような画面が表示される。Deleteボタンを押すと実際にレコードがDeleteされる。