Что такое context_object_name в представлениях django?

Я новичок в джанго. И теперь я изучаю использование общих представлений на основе классов. Может ли кто-нибудь объяснить цель и использование атрибута context_object_name?


person megido    schedule 11.05.2011    source источник


Ответы (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>

Это означает, что вы можете изменить исходное имя параметра (object_list) на любое имя через «context_object_name» для вашего представления. Надеюсь, что поможет :)

person user2395922    schedule 20.11.2013

Хорошо, я получил это сам! :)

Это просто понятное человеку имя переменной для доступа из шаблонов

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

person megido    schedule 12.05.2011
comment
Вот ссылка на последнюю версию (версия 1.8): docs.djangoproject.com/en/1.8/topics/class-based-views/ - person Cheng; 27.04.2015

Предположим, что следующие сообщения/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, а во второй строке нам нужно явно указать, какую модель мы используем. В представлении мы создаем подкласс ListView, указываем имя нашей модели и указываем ссылку на наш шаблон. Внутренне ListView возвращает объект с именем object_list, который мы хотим отобразить в нашем шаблоне.

В нашем файле шаблонов home.html мы можем использовать цикл for языка шаблонов Django для вывода списка всех объектов в object_list.

Почему object_list? Это имя переменной, которую ListView возвращает нам.

Давайте посмотрим на наши шаблоны/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 и изменим его, добавив одну строку ниже:


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, и это все равно работало бы, но вы поняли идею.

person Stryker    schedule 06.10.2018

Обратите внимание на эти два фрагмента кода

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 %}

person Amit Baderia    schedule 23.10.2020