vistas get_context_data genericas createview create based django-class-based-views

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.



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 :)