SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

Django - URLに引数を指定してページ遷移する

小ネタです。

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タグを使います。

docs.djangoproject.com

書く場合は、

  • 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を使うのが比較的簡単です。

docs.djangoproject.com

  • 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指定です。複数の引数がある場合等、まだ論点はありますが、それは追記したいと思います。

簡潔な記事となりますが、以上です。

*1:世の中のWebフレームワークならなんでもそうだけど

*2:django.urlsにある

*3:型指定等は無い。対象となったmodelの内容を知っておかなければならないが、今回はクラスのmodelで指定したものが入る