2009-12-18 6 views
5

Según The Django Book, sistema de plantillas de Django soporta operaciones de búsqueda de puntos anidados:operaciones de búsqueda de puntos anidadas en Django plantillas

búsquedas de Dot se pueden anidar varios niveles de profundidad. Por ejemplo, el siguiente ejemplo usa {{person.name.upper}}, que se traduce en una búsqueda de diccionario (person ['name']), luego una llamada a método (upper()): '{{person.name.upper }} es {{person.age}} años de edad. '

¿Hay goblins con este enfoque no ampliamente cubierto en la documentación? Estoy teniendo problemas con las búsquedas de puntos anidados - aquí hay un ejemplo mínimo:

views.py:

test = [{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}] 
ndx = 'bar' 
t = loader.get_template('meh.html') 
c = Context({'test': test, 
      'ndx': ndx,}) 
return HttpResponse(t.render(c)) 

plantilla meh.html:

<pre> 
    {{ test }} 
    {{ test.0 }} 
    {{ test.0.ndx }} 
</pre> 

resultante HTML:

<pre> 
[{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}] 
{'foo': [1, 2, 3], 'bar': [4, 5, 6]} 

</pre> 

La búsqueda anidada de una clave de diccionario dentro de un elemento de lista no devuelve nada, cuando espero [4, 5, 6].

J.J.

+0

Como Goblin, estoy profundamente ofendido por esta caracterización de toda una raza ... ;-) – cethegeek

Respuesta

8

Creo que el problema es que está esperando que se evalúe ndx cuando eso nunca sucede. Ha intentado esto:

{{ test.0.bar }} 

Creo que hará lo que esté buscando.

¿Hay duendes con este enfoque ...?

Algo así, pero no son los que estamos hablando, y no creo que es debido a la anidación o, al menos, que no empeoran después de obtener un nivel de profundidad. Lo que quiero decir con esto es que todos los parámetros de búsqueda son literales. No hay forma de cambiar eso. Entonces, si bien es posible que pueda desarrollar etiquetas de plantilla personalizadas y pasarles literales o variables para evaluar, no tiene suerte si quiere acceder directamente a algún miembro de una variable en función del valor evaluado de otro valor. (Posiblemente podría escribir una etiqueta de plantilla para esto, pero no funcionará en todas las situaciones deseadas y es posiblemente más complicado de lo que vale.)

Para lo que sea, esto parece una faceta bastante intencional de la creación de plantillas idioma. Lo invito a considerar cómo debe saber el descriptor de acceso si {{ foo.bar }} debe leerse como foo[bar] o foo['bar']. No parece posible hacer un juicio significativo sin complicar la sintaxis y eso es algo que el diseño de la plantilla de django es inflexible en cuanto a evitar.

+2

Gracias por responder la pregunta que * debería * haber estado haciendo. :-) –

1

David tiene razón: ndx no se evaluará para obtener una clave, se utilizará literalmente como una clave. Puede definir una nueva etiqueta de plantilla para hacer lo que desee, aquí hay una simple: http://www.djangosnippets.org/snippets/1412/

4

Para ampliar la respuesta de David, el sistema de plantillas de Django no le permite usar el valor de una variable de contexto como clave.Así, en su ejemplo

{{ test.0.ndx }} 

es en realidad buscando la clave "ndx" en el primer elemento de la variable test contexto.

Si necesita esta funcionalidad, es necesario implementar por sí mismo, como un filtro de plantilla. This ticket tiene más información, incluido el razonamiento de los desarrolladores de Django detrás de la omisión de esta función y una implementación de ejemplo del filtro de plantilla que está buscando.

1

me gustaría sugerir o bien (y estoy de acuerdo con la interpretación de David de su problema):

{{ test.0.bar }} # as david mentioned, or 

ndx=test[0]['bar'] # in views 
{{ ndx }} # in template 
Cuestiones relacionadas