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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

767閲覧

Djangoでブログサイトを作成する際、投稿記事の一覧ページから詳細ページを表示させたい

ggg3

総合スコア17

Django

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/07 15:55

お世話になります。
現在Djangoでブログサイトを作成しています。
投稿記事の一覧ページに記事のタイトルと記事の詳細画面へのリンクを作り、クリックすると記事の詳細ページを表示させる処理を行いたいですが、Django内部での処理がイメージつかないため、書き方が分からず困っています。
ちょうどこちらの一般サイトに似たような処理が書かれているので、例として引用させて頂きます。

このサイトを例に取ると、アプリケーションのurls.pyに以下の記載があり、views.pyへと処理を渡す記述があります。

from django.urls import path from . import views app_name = 'blogs' urlpatterns = [ path('', views.index, name='index'), path('detail/<int:blog_id>/', views.detail, name='detail'), ]

上記コードの解説は以下のように記載されています。

トップページからのリンクで、変数blog_idには数字が代入された状態で情報を受け取っているので、ここにはその数字が自動的に入力されることになります。また、ここに入った数字は変数blog_idに代入されてViewに渡されます。これで、URLhttp://127.0.0.1:8000/detail/1のページではid=1の記事の詳細ページを表示する準備をしています。ただし、まだViewやHTMLファイルを作っていないので、現段階でこのURLにアクセスしてもエラーが出ます。

第二引数は、1つ上のpathと同様のことをしています。このURLでは、views.pyファイルのdetail関数が処理されることを意味しています。
第三引数は、このURLにdetailという名前をつけています。名前をつけることで、<a href="{% url 'blogs:detail' blog_id=blog.id %}">記事を読む</a>のリンクをクリックした時にこのpathに飛ぶようになります。

なぜトップページからのリンクを貼ると変数blog_idに自動的に数字が代入されるのでしょうか?
また、urls.pyの中のトップページを表す記述(上記でいうとpath('', views.index, name='index'))からviews.pyのindex関数へ処理が飛ぶのは理解できますが、トップページを表す記述から詳細ページを表示する際、どのような処理が行われるのかイメージが付きません。(urls.pyからviews.pyのindex関数が呼ばれ、その後に再びurls.pyへ処理が飛んで、最後にviews.pyののdetail関数が処理される?)
どなたか教えて下さい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1. なぜトップページからのリンクを貼ると変数blog_idに自動的に数字が代入される

あなたが引用した文の少し前に、トップページのHTMLが書いてありました。
トップページでは、こんな感じになっていて、

HTML

1{% for blog in blogs %} 2 <div> 3 <h3>{{ blog.title }}</h3> 4 <div>{{ blog.text | truncatechars:100 }}</div> 5 <div style="text-align: right;"> 6 <a href="{% url 'blogs:detail' blog_id=blog.id %}">記事を読む</a> 7 </div> 8{% endfor %} 9```blogsにブログが何個か入っていて、それをfor文で1つずつblogに代入しています。 10この6行目

<a href="{% url 'blogs:detail' blog_id=blog.id %}">記事を読む</a>
```それぞれのブログの、記事を読むリンクは、blog_id=blog.idのようになっており、押すと、/detail/<それぞれのid>/に飛ぶようになっています。

2. トップページを表す記述から詳細ページを表示する際、どのような処理が行われるのか

先ほど言ったように、/detail/<それぞれのid>/に飛ぶただそれだけなのですが、飛んだら、views.detail 関数が呼ばれます。例えば/detail/2/に飛んだら、views.detail 関数が呼ばれて id=2 のブログの詳細が表示されますね。

不明点がありましたら、コメントをお願いします。

投稿2020/06/07 20:41

ForestSeo

総合スコア2722

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

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

ggg3

2020/06/08 15:44

返信ありがとうございます。 1点目については理解できました。ありがとうございます。 2点目について、ご回答と引用した記事を改めて読み直し、以下のように解釈してみましたが、あっておりますでしょうか? ・アプリケーション内のurls.pyで指定してある通り、特にURLに指定がなければviews.pyのindex関数に処理が飛ぶ ・次に、そのviews.pyのindex関数ではblogsの内容をblogs/index.htmlに渡して、blogs/index.htmlがブラウザ上に表示される。 ・この時、渡されたblogsがindex.html内の{% for blog in blogs %}で処理され、リンクも含めたHTMLが作成(完成)する。 ・リンクには'blogs:detail'とあるのでそれをクリックすると(予めurls.pyにname='detail'というようにパス自体に'detail'という名前をつけてあるのでそれを目印にして)urls.pyのpath('detail/<int:blog_id>/', views.detail, name='detail')に飛ぶ。 ・この飛ぶ時に、blog_idも一緒にurls.pyへ渡され、urls.pyの'detail/<int:blog_id>/'の<int:blog_id>に代入される。(ちょっとこのあたりの理解が怪しいです) ・するとviews.pyのdetail関数に処理が飛ぶ。この時blog_idも一緒に渡される。 ・blog_idをキーにブログ情報が取得される(Blog.objects.get) ・最後に'blogs/detail.html'へblogデータを持ったまま飛び、detail.html内部でblogのtitleやtextが展開されHTMLが生成される。 いかがでしょうか? Djangoの一般のサイトを見ると、urls.pyから処理の依頼が来た後は、views.pyが中心となり、forms.pymodels.py、html(テンプレート)とやりとりするように見えます。今回の場合は細かく見ると、index.htmlというhtmlからurls.pyへ、そして再びvews.pyへ処理が飛ぶという事でしょうか。つまりviews.py以外が処理を実行する側になる事もある、という事でしょうか? 長文失礼しました。教えて下さい。
ForestSeo

2020/06/08 21:34

URLに変数が埋め込まれているという感じで、 path('detail/<int:blog_id>/', views.detail, name='detail'), この場合 int:blog_id なので int 型のオブジェクトを受け取ります。 > views.py以外が処理を実行する側になる どんな処理かが分かりませんが、HTML側に値を渡したりするのは views だけだと思います。 HTMLでは、変数を埋め込んだURLにとぶリンクを作り、urls.py ではその変数を受け取り detail 関数は引数にそれを取ります。なので def detail(request, blog_id): こんな感じで。 /detail/2 にアクセスすると、urls.py でどの関数を実行するか、変数は何だったかを受け取り、views.detail 関数でURL変数を引数にして実行します。
ForestSeo

2020/06/08 21:35

ちなみにURLの変数を 「URLパラメータ」 といいます
ggg3

2020/06/09 14:01

非常に丁寧な解説ありがとうございました。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問