es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No hay ningún valor devuelto en el HTML impulsado por Django

Busqué la solución durante casi 2 días sin éxito, cualquier orientación es muy apreciada.

Dado que ‘views.py’ se ve así (todas las librerías necesarias se importan correctamente):

from django.shortcuts import render, get_object_or_404  
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from django.template.context_processors import request
from django.views import generic             

class HomeView(generic.TemplateView):   
    template_name = 'polls/djIndex.html'
    def test(request):
        data = {'temperature': '53F', 'state': 'NY', 'mood': ['good', 'bad']}
        return render(request, 'polls/djIndex.html',{'data':data}) 

Estos no funcionan (no se devuelve ningún valor) en djIndex.html:

Prueba #1:

{% for key, value in data.items %}
    <h3>{{key}}-----: {{value}}</h3>
{% endfor %}

Prueba #2:

{% for key in data.items %}
   <p>Value of Key 1 : data["temperature"]</p>
{% endfor %}

Prueba #3:

{% for key, value in data %}
    <p>Key {{ key }}, Value {{ value }}</p>
{% endfor %}

Prueba #4:

<h2> context2: {{data.temperature}}</h2>

Pero estos funcionan en djIndex.html:

<h2> Temperature: {{temperature}}</h2>
<h2> State: {{state}}</h2>
<h2> Mood: {{mood}}</h2>

Pregunta: ¿Cómo hacer que esas pruebas no funcionales (#1-#4) funcionen en mi página HTML? Especialmente la prueba #3 y #4. ¿Estoy haciendo algo mal en mi configuración de Django, ya que algunas de esas pruebas #1-#4 son respuestas aceptadas en algunos foros en diferentes instancias?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema puede deberse a la forma en que se están pasando las variables a la plantilla. En la implementación actual, el diccionario de datos se pasa como una variable de contexto llamada “data”. Para acceder a sus claves y valores en la plantilla, necesitamos utilizar la sintaxis de búsqueda de diccionario (es decir, data.key o data[key]).

    Para solucionarlo, podemos actualizar la clase HomeView de la siguiente manera:

    class HomeView(generic.TemplateView):   
        template_name = 'polls/djIndex.html'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['data'] = {'temperature': '53F', 'state': 'NY', 'mood': ['good', 'bad']}
            return context
    

    En esta versión actualizada, estamos sobrescribiendo el método get_context_data() de la clase TemplateView para pasar el diccionario de datos como una variable de contexto llamada “data”. Esto nos permitirá utilizar la sintaxis de búsqueda de diccionario en la plantilla.

    Con este cambio, las siguientes plantillas deberían funcionar:

    test #1:

    {% for key, value in data.items %}
        <h3>{{key}} -----: {{value}}</h3>
    {% endfor %}
    

    test #2:

    {% for key in data %}
        Valor de la clave 1: data["{{ key }}"]
    {% endfor %}
    

    test #3:

    {% for key, value in data.items %}
        Clave {{ key }}, Valor {{ value }}
    {% endfor %}
    

    test #4:

    <h2>contexto2: {{ data.temperature }}</h2>
    

    Vale la pena mencionar que los ejemplos de trabajo que mencionaste pueden estar accediendo directamente a las claves del diccionario porque se pasaron como variables de contexto separadas (es decir, context[‘temperature’] = ’53F’). Sin embargo, en este caso, las pasamos como un solo diccionario, por lo que necesitamos utilizar la sintaxis de búsqueda de diccionario para acceder a ellas en la plantilla.

Comments are closed.