日報:2019/12/22

今日の出来事

  • 大掃除してた
  • Advent Calendar を書いてた
  • Blogのプロジェクト作成の為にDjangoチュートリアルを勧めている(大分アレンジしつつw)

所感

Advent Calendar

www.ikkitang1211.site

書いてた。 (いじりすぎか。。)

Django のBlogプロジェクト

これぐらいのボリューム感なら Railsチャレンジしても良いのかな、とも思った。まあ、Djangoなれる為にも頑張ろう。

普段は主にDjangoAPIの為に使用しているので、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 %}

学び〜。

来週一週間で仕事納めですね。頑張ってこ。