python、djangoのurls.pyで設定するnameってなんやねん??
ということをdjangoをやりはじめた当初はよく分かっていませんでした。
いまでも怪しいのでまとめてみましょう。
djangoをにはurls.py(djangoはurls.pyが2つ存在するのですが、アプリケーションの中にあるurls.pyのことです)にnameと書くことがあります。
from django.urls import path
from . import views
app_name = 'board'
urlpatterns = [
path('', views.ListView.as_view(), name='board'),
path('good/<int:pk>', views.good, name='good'),
]
こんな風になっています。ひとつひとつ解体していくと・・・。
path('good/<int:pk>',
これはURLの設定。
views.good
これはそのURLに使う関数の設定。
この設定が無いとviews.pyで関数を作ってもそのページで使用できません。
name='good'
なんだこいつ??
このname='good'。html部分によく使われます。
以下はフォームを送信するとurls.pyで設定したpath('good/int:pk', に飛びます。
<form action="{% url 'board:good' post.pk %}" method="post">
{% csrf_token %}
<input type="submit" name="good" value="いいね" id="test">({{ post.good }} いいね)<p style="color:red"><font size="1"><strong>押すと1ページ目まで戻ってしまいます!(いつか直す!)</strong></font></p>
</form>
飛ぶのはいいのですがメンテナンス部分には問題があって、これって例えば
<form action="/board/good/" method="post">
と書いてしまうと設定しているurlが変更になると該当箇所は全部書き換えですよね?
なのでurlにname='good'のように名前を設定しておいて
path('good/<int:pk>', views.good, name='good'),
formのurlも名前であるgoodに書き換えます。
<form action="{% url 'board:good' post.pk %}" method="post">
'board:good'と書き換えればurlが変更してもnameは変更になっていないのでform部分は変更する必要が無いんですね。
多分これは逆引きという方法だと思います。普通にURL書くのは正引き?間違ってたら教えてください。
他にもメリットがあるような気がしているのですが今のところよく分かっていませんw
ちなみに
'board:good'
のboardはurls.pyの
app_name = 'board'
です。
boardアプリケーションのgoodと名前のついたurlを指定しているんですね。
djangoプロジェクト内には複数のアプリケーションを作ることが可能なので、app_nameを重複させないように気を付けてくださいね。
重複させたらどうなるのか試したことはないけれど。