質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3361閲覧

複数のパラメーターが混在するurlをHTMLに出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/09 15:16

前提・実現したいこと

  • DjangoでWebサイトを作成しています。
  • HTML上に下記のようなurl(単一のパラメーター)を出力させたい時は、

html

1<a href="example/item/1/">Item1</a> 2<a href="example/item/2/">Item2</a> 3<a href="example/item/3/">Item3</a>

urls.py上で、

python

1# urls.py 2urlpatterns = [ 3 path('item/<pk>/', ItemDetailView.as_view(), name='item_detail'), 4]

と書き、テンプレート上で、

html

1<!--テンプレート--> 2{% for item in items %} 3 <a href="{% url 'item:item_detail' item.pk %}">item.name</a> 4{% end for %}

のように書けば良いと思います。

  • 一方で、HTML上に下記のような複数のパラメーターが混在するurlを出力させたい時はどうしたら良いでしょうか?

html

1<!--出力されたHTML--> 2<a href="example/item/1/howtouse/">Item1 | 使い方</a> 3<a href="example/item/1/function/">Item1 | 機能</a> 4<a href="example/item/1/specification/">Item1 | 仕様</a> 5<a href="example/item/2/howtouse/">Item2 | 使い方</a> 6<a href="example/item/2/function/">Item2 | 機能</a> 7<a href="example/item/2/specification/">Item2 | 仕様</a> 8<a href="example/item/3/howtouse/">Item3 | 使い方</a> 9<a href="example/item/3/function/">Item3 | 機能</a> 10<a href="example/item/3/specification/">Item3 | 仕様</a>

考えたコード

python

1urls.pyは下記のような感じで良いと思います。 2# urls.py 3urlpatterns = [ 4 path('item/<pk>/tokyo/', TokyoView.as_view(), name='tokyo'), 5 path('item/<pk>/nagoya/', NagoyaView.as_view(), name='nagoya'), 6 path('item/<pk>/osaka/', OsakaView.as_view(), name='osaka'), 7]

上記の通り、nameがそれぞれ違うので、テンプレートに記載するname(××××の部分)をどうしたら良いかが分かりません。

html

1<!--テンプレート--> 2{% for item in items %} 3 {% for prefecture in prefectures %} 4 <a href="{% url 'item:××××' item.pk prefecture.name %}">item.name | prefecture.name</a> 5 {% endfor %} 6{% endfor %}

複数のパラメーターの組み合わせがある場合、どのようにしてテンプレートに機動的に組み込んだらよいのでしょうか。
お分かりの方、ご教示頂ければ幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ForestSeo

2020/05/09 22:23

アプリごとにurls.pyを作っていますか?
guest

回答2

0

app_nameを指定しない場合はいけます

HTML

1<a href="{% url prefecture item.pk %}">

投稿2020/05/10 00:19

ForestSeo

総合スコア2722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

tokyo、nagoya、osakaといった都道府県名(nagoyaは違うけど)を、prefecture_nameでまとめて受け取る方法を、以下に示します。

python

1# urls.py 2urlpatterns = [ 3 path('item/<int:pk>/<str:prefecture_name>/', SpamView.as_view(), name='spam'), 4]

html

1{% url 'app_name:spam' pk=item.pk prefecture_name=prefecture.name %}

都道府県でViewを分けたいのであれば、テンプレートタグでURLを取得する方法はどうでしょうか?

python

1# app/templatetags/spam.py 2from django import template 3register = template.Library() 4@register.simple_tag 5def get_uri(item: Item, prefecture_name: str) -> str: 6 view_name = f'app:{prefecture_name}' 7 return reverse(view_name, kwargs={'pk': item.id,})

html

1{% load spam %} 2{% for item in items %} 3 {% for prefecture in prefectures %} 4 <a href="{% get_uri item prefecture %}">{{ item.name }} | {{ prefecture.name }}</a> 5 {% endfor %} 6{% endfor %}

投稿2020/05/10 00:12

編集2020/05/11 23:47
hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/10 13:06

ご回答ありがとうございます。 tokyo,nagoya,osakaで、それぞれviewが違っているため、どうしたら良いか困っております。
hasami

2020/05/10 22:42

都道府県それぞれのビューを実装するのですか?
退会済みユーザー

退会済みユーザー

2020/05/11 21:13

はい、都道府県によって、ビューの内容が全く異なっており、それぞれ実装をします。
退会済みユーザー

退会済みユーザー

2020/05/12 23:29

ありがとうございます。 しかし、今回は、アイテムと都道府県の二つの変数が組み合わさってURLが出来上がるのですが、複数の変数を受け取るカスタムフィルターの作り方が分かりませんでした。 そのため、結局、邪道な気はしますが、urlsを用いず、 <a href="/item/{{item.id}}/{{prefecture.name}}/" target="_blank"> という形で書きました。
hasami

2020/05/12 23:50

エンドポイントとビューの関係上、urlテンプレートタグを使用しない方法も良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問