web-dev-qa-db-ja.com

Djangoビューのcontext_object_nameとは何ですか?

Djangoは初めてです。そして今、私はクラスベースのジェネリックビューを使用して勉強しています。 context_object_name属性の目的と使用法を誰かに説明してもらえますか?

23
megido

わかりました、私はそれを自分で持っています! :)

テンプレートからアクセスするための、人間が理解できる変数の名前です。

https://docs.djangoproject.com/en/1.10/topics/class-based-views/generic-display/#making-friendly-template-contexts

19
megido

「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)を任意の名前に変更できます。お役に立てば幸いです:)

49
user2395922

次の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'

1行目で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のままにしておくこともできますが、それでも機能しますが、アイデアは得られます。

4
Stryker