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

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

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

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

Q&A

解決済

1回答

1007閲覧

djangoでurlテンプレートタグを使ったリンクの貼り方

tomoysh

総合スコア42

Django

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

0グッド

1クリップ

投稿2021/06/29 08:38

編集2021/07/02 07:29

前提・実現したいこと

urlのキーワードを使ってテンプレートで遷移先を指定したい。

自分なりに調べてみたのですが、解決できなかったので教えていただければ幸いです。

urls.pyのstr:name_enで受け取ったキーワードでfilterをかけて、その一覧を表示するリンクを作りたいです。
templateの<a>タグに{%%}の記法を使って試してみましたが、下記のエラーによりうまくいきませんでした。

発生している問題・エラーメッセージ

NoReverseMatch at /category_index/Trip
Reverse for 'category_index' with no arguments not found. 1 pattern(s) tried: ['category_index/(?P<name_en>[^/]+)$']

class CategoryIndex(ListView): template_name = 'vlogapp/index_list.html' paginate_by = 2 def get_queryset(self, **kwargs): queryset = PostModel.objects.filter(category__name_en = self.kwargs['name_en']) return queryset
path('category_index/<str:name_en>', CategoryIndex.as_view(), name='category_index'),
<ul class="navbar-nav me-auto mb-2 mb-lg-0"> <li class="nav-item active"> <a class="nav-link" aria-current="page" href="{% url 'paging' %}">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="">Programing</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'category_index' %}">Clothes</a> </li> <li class="nav-item"> <a class="nav-link" href="">Trip</a>

試したこと1

試しにclassbasedViewで作った以下のView

class List(ListView): model = Category ordering = ['-created_at'] paginate_by = 2 template_name = 'vlogapp/list.html'

を{% url ' viewの名前' %}をtemplateに貼り付けたところ問題なく機能した。
###試したこと2

直接、http://127.0.0.1:8000/category_index/Trip
http://127.0.0.1:8000/category_index/Clothesの様にリクエストを送ると、
意図したページ(categoryごとの一覧ページ)が表示されるのでデータの取得には問題ない様に思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

urls.pyに設定したパス情報に変数がある場合、テンプレートタグ側は{% url view名 引数... %}で順に値を引き渡してあげればよいです。

質問内にあったコードをもとにした例:

diff

1 <li class="nav-item"> 2- <a class="nav-link" href="{% url 'category_index' %}">Clothes</a> 3+ <a class="nav-link" href="{% url 'category_index' 'Clothes' %}">Clothes</a> 4 </li>

※テンプレートに変数として渡しているものを使う場合は、そのまま変数を記述すればよいはず

Django公式ドキュメントのチュートリアル内に使用例があるので、一通り読むと良いかなと思います。

投稿2021/07/02 09:37

attakei

総合スコア2740

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

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

tomoysh

2021/07/03 09:30

ご回答ありがとうございます。 御指南いただいた記法で実装できました。 引数のClothesをクオーテーションなしで記述してましたので、それが誤りだった様に思います。 ただ、 {% for item in category %} <a href="{% url 'detail' item.pk %}"</a> {% endfor %} の様にfor文で回したpkを取得するときは引数のクーオーテーションで囲むのはなぜでしょうか? 今回の場合との違いを教えていだだければ幸いです。
attakei

2021/07/03 12:29

> {% for item in category %} > <a href="{% url 'detail' item.pk %}"</a> > {% endfor %} これ、Djangoテンプレートとしては正しいんですけど、生成されるものがHTMLとして間違ってるんですよね… 更にいうと、 > の様にfor文で回したpkを取得するときは引数のクーオーテーションで囲むのはなぜでしょうか? これの「引数のクーオーテーション」がどこを指すかがちょっとわからないです。(自分の中では、囲んでない認識でいます) ので、「こう書いたとき」「こうなると思っていた」というような形式で書いてみてもらえるでしょうか。 そうしてもらえれば、もしかしたら適切なレスポンスを返せるかもしれません。
tomoysh

2021/07/04 04:42

大変失礼しました。 生成されるものがHTMLとして間違ってるというのは,、aタグを閉じていないということでしょうか? <a href="{% url 'detail' item.pk %}"></a> 上記のコードで合っていますか? 「引数のクーオーテーション」とは <a class="nav-link" href="{% url 'category_index' 'Clothes' %}">Clothes</a> の中のClothesを囲むクオーテーションのことです。 for文で回しpkを取得する方法ではクオーテーションで囲む必要はないという認識でいました。この場合だと以下の部分のitem.pkにあたる部分です。 {% url 'detail' item.pk %} その認識から今回、回答いただいた、 <a class="nav-link" href="{% url 'category_index' 'Clothes' %}">Clothes</a> のurlタグの中のClothesをクオーテーションで囲む理由を知りたい、ということです。 わかりにくい質問で申し訳ございません。
attakei

2021/07/04 05:36

> 生成されるものがHTMLとして間違ってるというのは,、aタグを閉じていないということでしょうか? そういうことですね。(こっちは枝葉なのでひとまずこのくらいの返答で) > 「引数のクーオーテーション」とは ... もちろんitem.pkを使う分にはクオートは不要です。 コメント内でのコードや質問文のコードから数歩先を推測する限り、categoryのリストから<li> ~~ </li>を作るのが中間ゴールだと思います。 そういったシーンではitemとitem.pkを使うべきだし、item.pkはDjangoテンプレート上では「変数」扱いになるため、クオートを使わずともそのまま使えます。 (むしろクオートで囲んでしまうと'item.pk'という文字列になりリンクも /category_index/item.pk という文字列になってしまいます) で、なぜ「クオーテーションで囲むのか」なのですが、回答における'Clothes'は「文字列」であって「変数」ではないためです。↑のitem.pkに関する話と真逆の理由ですね。 回答にこちらの形式を使った理由はそこまで大したものではなく、「使い方をシンプルに示すなら、変数は少ないほうが良いと考えている」ぐらいの理由が主ですね。 後は強いて言えば、質問内コードでループを使うのかを断定できなかったからでしょうか。
tomoysh

2021/07/04 09:20

長くなりすぎないようにと関連コードを省いたのが逆に良くなかったですね。 初めての質問でしたので。 丁寧なご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問