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

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

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

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

Python

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

Q&A

解決済

2回答

1506閲覧

オブジェクトのIDをテンプレートタグ内で指定する

kazu25

総合スコア27

Django

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

Python

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

0グッド

0クリップ

投稿2020/07/16 11:56

views.py

Django

1class PostDetailView(DetailView): 2 model = Post

django

1{% block body %} 2<div class="wrapper-detail"> 3 <div class="section-heading"> 4 <h1>{{ object.title }} <small>written by: </small><span>{{ object.author }}</span></h1> 5 <p class="subheading">{{ object.date_posted | date:'Y-m-d P'}}</p> 6 </div> 7 <form class="detail-form" action="{% url 'post-update' post.id %}"> 8 <button type="submit" class="btn btn-success btn-lg slide">Update</button> 9 </form> 10 <form class="detail-form" action="{% url 'post-delete' object.id %}"> 11 <button type="submit" class="btn btn-danger btn-lg slide">Delete</button> 12 </form> 13</div> 14 15{% endblock body %}

post_detail.html{% url 'post-update' post.id %}post.idの箇所は、object.idのみ有効と思っていたのですが、post.idobject.idの両方正常に動きます。
なぜpost.id でも動くのでしょうか。

views.pyのPostDetailView(DetailView)に関しては特にcontext_object_nameの値を指定していないので、postはどこからきたのかが分からないです。(objectに関しては公式に記載してある通りなので理解できます)

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

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

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

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

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

quickquip

2020/07/17 01:05

コード中の DetailView が django.views.generic.DetailView じゃないのでは?
kazu25

2020/07/17 01:33

from django.views.generic import DetailViewになっています
guest

回答2

0

ベストアンサー

https://github.com/django/django/blob/3.0.8/django/views/generic/detail.py#L106

python

1 self.object = self.get_object() 2 context = self.get_context_data(object=self.object)

から

https://github.com/django/django/blob/3.0.8/django/views/generic/detail.py#L95

python

1 context['object'] = self.object 2 context_object_name = self.get_context_object_name(self.object) 3 if context_object_name: 4 context[context_object_name] = self.object

から

https://github.com/django/django/blob/3.0.8/django/views/generic/detail.py#L82

python

1 elif isinstance(obj, models.Model): 2 return obj._meta.model_name

となるので、self.objectをテンプレートで参照するのに、objectのほかに、(django.models.Modelのインスタンスの場合)self.object._meta.model_nameの結果も使えます。

結果obejctでもpostでも同じオブジェクトを指します。

投稿2020/07/17 02:23

編集2020/07/17 02:28
quickquip

総合スコア11235

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

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

0

Django で models.Modelを継承してモデルを作ると、自分でフィールドを定義しなくてもデフォルトで自動連番で id という主キーが振られます。公式ドキュメント:モデル
デバッガで処理を止めて、何かのモデルのインスタンスを見ると、id = {int} 31 などと番号が振られているのが分かります。だから、モデル post は id というフィールドを持っていて、テンプレートでエラーなしに使われたということです。
ちなみに、pk というのも自動で振られていて、id と全く同じ番号と役割をしていますが、これについて詳しくは、私は分かっておりません(どなたかご説明いただけると嬉しいです)。

投稿2020/07/16 13:53

MorningMushroom

総合スコア53

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

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

kazu25

2020/07/17 00:41

idが自動採番されているのは存じ上げておりますが、template(html)の中で、" object "という名前を用いでobject.idとしてmodelのインスタンスのフィールドを参照できると理解しています。しかし、なぜPost.idでもモデルのインスタンスのidを参照できるのかがわからないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問