本日のお題
今回はdjangoアプリでの動的urlの取り扱いについてまとめます。
動的urlとは、その時々の状況によってurlの一部もしくは全体が変化するようなもののことです。
viewsにパラメータを渡すためにurlの一部にレコードのidを混ぜ込む場合などが代表例ですね。
今回は例として/myapp/delete/xx(xxにはレコードのidが入る)というurlを動的に作成し、そこにリクエストを送ることでそのレコードが削除されるようにしてみたいと思います。
目次
- urls.pyの編集
- views.pyの編集
- テンプレートの編集
urls.pyの編集
動的urlを使ってレコードを削除するために編集する必要があるのは、urls.py、views.py、テンプレートの三箇所です。
まずはurls.pyを編集し、delete/xxへのリクエストでレコード削除の関数が呼び出されるようにします。
urlpatterns = [
path("delete/<int:pk>/", views.myapp_delelte, name="myapp_delete")
]
int:pkがパラメータを埋め込む部分になります。
<パラメータの型:パラメータ名>のように記述します。
パラメータ名に関してはなんでも良いのですが、このあとviewsで同じ名前を使うのでpk(primary key)やidのようにわかりやすいものが良いと思います。
次に、このパラメータを用いてレコードを削除していきます。
views.pyの編集
views.pyを以下のように編集します。
def myapp_delete(request, pk):
Post.objects.filter(id=pk).delete()
return render(request, "myapp/index.html")
requestに加えて、先程指定したpkを引数としているところに注意してください。
他は特に問題ないかと思います。
最後に、このdelete/xxへのリンクをテンプレート上に作成します。
テンプレートの編集
テンプレート上では以下のように書くことで、動的なurlを作成することができます。
<!-- aタグを用いる場合 -->
<a href="{% url 'myapp:myapp_delete' post.id %}">
<!-- formタグを用いる場合 -->
<form method="post" action="{% url 'myapp:myapp_delete' post.id %}">
{% csrf %}
<button type="submit">削除</button>
</form>
要はhref属性の値の中にパラメータも入れてしまえば良いということですね。
終わりに
以上で動的なurlの作成方法については終了です。
パラメータの型についてはint以外でも指定できるみたいですが、そちらについては機会があればまとめます。