LoginSignup
28
29

More than 5 years have passed since last update.

python、djangoのurls.pyで設定するnameってなんやねん??

Posted at

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を重複させないように気を付けてくださいね。
重複させたらどうなるのか試したことはないけれど。

28
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
29