小ネタです。
Djangoでは*1、URLに引数を指定して、動的に遷移先を変える、みたいなことができます。
例:
- models.py
from django.db import models class Table(models.Model): """テーブル一覧""" name = models.CharField(max_length=100)
- urls.py
from django.urls import path, from ..views import table app_name = 'app' urlpatterns = [ path('table/<int:pk>', table.TableDetailView.as_view(), name='table'), ]
という記述だと、引数pk
を受け取って、それに応じたページを表示できます。
Templateから遷移
Template
から遷移する場合は、url
タグを使います。
書く場合は、
- templates/tables.html(抜粋)
<ul> {% for table in tables %} <li> <a href={% url 'app:table' table.id %}>{{ table.name }}</a> </li> {% endfor %} </ul>
先頭から順に指定します。
Viewから遷移
Viewで遷移する場合といえば、
- オブジェクトを新規作成した
- オブジェクトを更新した
場合等が挙げられます。この場合、View側で新規作成、更新されたオブジェクトを取得してから、遷移処理を行います。
それを前提とした場合、reverse
*2を使うのが比較的簡単です。
- views.table.py(抜粋)
from django.views.generic import CreateView from django.urls import reverse from ..forms.table import TableForm class TableCreateView(CreateView): """テーブル作成""" model = Table form_class = TableForm template_name = 'app/create.html' def get_success_url(self): return reverse('app:table', kwargs={'pk': self.object.id})
作成処理自体は、ジェネリックビューのCreateView
を使って簡潔にしています。
上記、get_success_url
が呼ばれる時点で、self.object
に作成、更新された後のオブジェクトが格納される*3ため、それを使って簡潔に遷移処理を記述できます。
おわりに
大した内容ではないですね。
現在、ジェネリックビューのEditing Viewについて記事を書いているのですが、Create、Update、Deleteそれぞれで論点が多いため、記事を分割している最中です。
その中の一つが、今回のURL指定です。複数の引数がある場合等、まだ論点はありますが、それは追記したいと思います。
簡潔な記事となりますが、以上です。