Я новичок в джанго. И теперь я изучаю использование общих представлений на основе классов. Может ли кто-нибудь объяснить цель и использование атрибута context_object_name?
Что такое context_object_name в представлениях django?
Ответы (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» для вашего представления. Надеюсь, что поможет :)
Хорошо, я получил это сам! :)
Это просто понятное человеку имя переменной для доступа из шаблонов
Предположим, что следующие сообщения/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, и это все равно работало бы, но вы поняли идею.
Обратите внимание на эти два фрагмента кода
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 %}