削除機能を追加しよう
さて、前回までで登録・更新までが出来るようになりました。
あとは削除ですね。では早速やっていきましょう。
前回、前々回もそうですが、下記のサイトを参考にしながら、python3.5とDjango2.0に対応させた記述にしています。
https://eiry.bitbucket.io/tutorials/tutorial/crud_delete.html
一覧画面に削除ボタンを追加
index.html
{% extends 'crud/base.html' %}
{% block body %}
<a href="/add">登録画面へ</a>
<form method="post" action="/delete"> #追加
<table border="1">
<thead>
<tr>
<th>部門名</th>
<th>略称</th>
<th>登録日</th>
<th> </th> #追加
</tr>
</thead>
<tbody>
{% for department in departments %}
<tr>
<td><a href="/edit/{{ department.id }}/">{{ department.name }}</a></td>
<td>{{ department.name_short }}</td>
<td>{{ department.created_at }}</td>
<td><input type="checkbox" name="delete_ids" value="{{ department.id }}"></td> #追加
</tr>
{% endfor %}
</tbody>
</table>
{% csrf_token %} #追加
<input type="submit" value="チェックしたものを削除"> #追加
</form>#追加
{% endblock %}
「#追加」と書いているところを追加しています。
今回初めてformタグでtableタグで囲むようにしました。
これまでは実はこのformタグはありませんでしたが、普通に動いていました。
formタグに関する一般的な説明は、こちらに良記事がありましたので参照してください。
https://qiita.com/mikuhonda/items/f3126380d3340f3d8a2b
ひとまずこれで削除ボタンを押すと、/deleteに遷移すると思いますので、試してみてください。
削除処理を書く
まずはviews.pyに追加します。
crud/views.py
from django.views.decorators.http import require_POST
そしてdelete処理を書きます。
views.py
@require_POST
def delete(request):
delete_ids = request.POST.getlist('delete_ids')
if delete_ids:
Department.objects.filter(id__in=delete_ids).delete()
return redirect('/')
これで確認をしてみてください。チェックしたものだけが削除されるようになっているはずです。
実際のアプリケーションでは、削除前に確認を入れるのが普通ですが、今回はとりあえず簡単にCRUD処理を実現するということに主眼を置いていますので、クリックしたらすぐに削除されます。