djangoは初めてです。そして今、私はクラスベースのジェネリックビューを使用して勉強しています。誰かがcontext_object_name属性の目的と使用法を説明してもらえますか?
4 に答える
「context_object_name」を指定しない場合、ビューは次のようになります。
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
ただし、{"context_object_name": "publisher_list"}のように指定すると、次のようにビューを記述できます。
<ul>
{% for publisher in publisher_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
つまり、ビューの「context_object_name」を使用して、元のパラメーター名(object_list)を任意の名前に変更できます。お役に立てば幸いです:)
わかりました、私はそれを自分で持っています!:)
テンプレートからアクセスするための、人間が理解できる変数の名前です。
次のposts/views.pyを想定しましょう。
# posts/views.py
from django.views.generic import ListView from .models import Post
class HomePageView(ListView):
model = Post
template_name = 'home.html'
最初の行でListViewをインポートし、2番目の行で使用しているモデルを明示的に定義する必要があります。ビューでは、ListViewをサブクラス化し、モデル名を指定し、テンプレート参照を指定します。内部的には、ListViewは、テンプレートに表示するobject_listというオブジェクトを返します。
テンプレートファイルhome.htmlでは、Djangoテンプレート言語のforループを使用して、object_list内のすべてのオブジェクトを一覧表示できます。
なぜobject_list?これは、ListViewが返す変数の名前です。
私たちのtemplates/home.htmlを見てみましょう
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in object_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
上記のobject_listが表示されますか?とてもフレンドリーな名前ではありませんか?よりユーザーフレンドリーにするために、代わりに context_object_nameを使用して明示的な名前を指定できます。
これは、コードを読んでいる他の人がテンプレートコンテキストで何が可変であるかを理解するのに役立ち、さらに読みやすく、理解しやすくなります。
それでは、posts / views.pyに戻って、以下の1行を追加して変更してみましょう。
context_object_name = 'all_posts_list' # <----- new
したがって、新しいviews.pyは次のようになります。
# posts/views.py
from django.views.generic import ListView from .models import Post
class HomePageView(ListView): model = Post
template_name = 'home.html'
context_object_name = 'all_posts_list' # <----- new
そして、今すぐテンプレートを更新することを忘れないでください:
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in all_posts_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
object_listのままにしておくこともできますが、それでも機能しますが、アイデアは得られます。
これらの2つのコードスニペットを検討してください
A.関数ベースのビューの使用:
def index(request):
product_list = Product.objects.all()
return render(request, 'product/index.html', {'product_list': **product_list**})
B.クラスベースのビューを使用する
class ProductListView(ListView):
model = Product
template_name = 'product/index.html'
context_object_name = 'product_list'
上記の両方の方法で、コンテキスト変数は「product_list」になり、HTMLは次のようになります。
{% for product in product_list %}
<div class="row">
<div class="col-md-3 offset-md-2">
<img src="{{product.product_image}}" class="card" height="150px" />
</div>
<div class="col-md-4">
<h3>{{product.product_name}}</h3>
.......
</div>
<div class="col-md-2">
.........
</div>
</div>
{% endfor %}