django class based views - get_context_data - ¿Qué es context_object_name en las vistas de django?
listview django (3)
Soy nuevo en Django. Y ahora estoy estudiando usando las vistas genéricas basadas en clase. ¿Podría alguien explicar el objetivo y el uso del atributo context_object_name ?
Asumamos los siguientes 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''
En la primera línea importamos ListView y en la segunda línea necesitamos definir explícitamente qué modelo estamos usando. En la vista, hacemos una subclase de ListView, especificamos nuestro nombre de modelo y especificamos nuestra referencia de plantilla. Internamente, ListView devuelve un objeto llamado object_list que queremos mostrar en nuestra plantilla.
En nuestro archivo de plantillas home.html podemos usar el bucle for de Django Templating Language para listar todos los objetos en object_list
¿Por qué object_list? Este es el nombre de la variable que ListView nos devuelve.
Veamos nuestras plantillas / home.html
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in object_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
¿Ves la lista_objeto arriba? ¿No es un nombre muy amigable? Para hacerlo más fácil de usar, podemos proporcionar un nombre explícito usando context_object_name .
Esto ayuda a cualquier otra persona que lea el código a comprender qué es la variable en el contexto de la plantilla, además de que es mucho más fácil de leer y entender.
Así que volvamos a nuestras publicaciones / views.py y cambiémoslas agregando la siguiente línea:
context_object_name = ''all_posts_list'' # <----- new
Así que nuestro nuevo views.py se ve así ahora:
# 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
Y no olvidemos actualizar nuestra plantilla ahora:
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in all_posts_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
Podrías haber dejado como object_list y aún funcionaría, pero entiendes la idea.
Ok, lo tengo solo! :)
Es solo un nombre de variable comprensible para el ser humano para acceder desde las plantillas
Si no proporciona "context_object_name", su vista puede tener este aspecto:
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
Pero si proporciona como {"context_object_name": "publisher_list"}, entonces puede escribir la vista como:
<ul>
{% for publisher in publisher_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
Eso significa que puede cambiar el nombre del parámetro original (object_list) a cualquier nombre a través de "context_object_name" para su vista. Espero que la ayuda :)