今日の出来事
所感
Advent Calendar
書いてた。 (いじりすぎか。。)
Django のBlogプロジェクト
これぐらいのボリューム感なら Railsチャレンジしても良いのかな、とも思った。まあ、Djangoなれる為にも頑張ろう。
普段は主にDjangoをAPIの為に使用しているので、viewのテンプレートを定義する方法はやった事がない。
意外と知ってない事があっておもしろい。
例えば、Djangoの urls.py という URLのパスを定義するファイルについて
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('<int:user_id>', views.detail, name='detail'), ]
こういう時、Viewのテンプレートでこんな感じで書いてるとすると・・・
{% if user_list %} <ul> {% for user in user_list %} <li><a href="/user/{{ user.id }}">{{ user.name }}</a></li> {% endfor %} </ul> {% else %} <p>No user.</p> {% endif %}
ユーザーの詳細URLを 変更したい時、 template をすべて変更しないといけない。
こういう時 Djangoの仕組みで 以下のように書く事で自動生成してくれる。
{% if user_list %} <ul> {% for user in user_list %} <li><a href="{% url 'detail' user.id %}">{{ user.name }}</a></li> {% endfor %} </ul> {% else %} <p>No user.</p> {% endif %}
文字列結合してたのを url 'urls.pyに定義したname' パラメータ
と定義すれば 自動でURLが生成してくれるようになる、という学びがありました。
ちなみに、detail
みたいにめちゃくちゃ目的範囲が強い場合、すぐにコンフリクトの懸念がある。
そういう場合はこんな感じで namespace みたいな事をして切り分けが出来る。
まずは urls.py で以下のように app_name を定義します。
from django.urls import path from . import views app_name = 'user' urlpatterns = [ path('', views.index, name='index'), path('<int:user_id>', views.detail, name='detail'), ]
そうすると template では user:detail
として namespace を区切る事が出来るようになります。
{% if user_list %} <ul> {% for user in user_list %} <li><a href="{% url 'user:detail' user.id %}">{{ user.name }}</a></li> {% endfor %} </ul> {% else %} <p>No user.</p> {% endif %}
学び〜。
来週一週間で仕事納めですね。頑張ってこ。