2011-01-28 9 views
31


Estoy tratando de pasar parámetros de URL a una plantilla de Django como esto ...necesidad de convertir una cadena a int en una plantilla de Django

response = render_to_string('persistConTemplate.html', request.GET) 

Este de la línea de llamada de mi archivo views.py. persistConTemplate.html es el nombre de mi plantilla y request.GET es el diccionario que contiene los parámetros de url.

En la plantilla trato de utilizar uno de los parámetros de este tipo ...

{% for item in (numItems) %} 

    item {{item}} 

{% endfor %} 

numItems es uno de los parámetros de URL que envío en mi solicitud como esta ...

http:/someDomain/persistentConTest.html/?numItems=12 

cuando intento el bucle anterior, me sale una salida como esta ....

image 1 image 2

estoy esperando y me gustaría para ver la imagen de la palabra impresa 12 veces ...

image 1 image 2 image 3 image 4 image 5 image 6 image 7 image 8 image 9 image 10 image 11 image 12

¿Alguien puede decirme qué me está yendo mal?

+1

¿Alguna razón en particular está haciendo esto en una plantilla y no en una vista? – bernie

+0

Bueno, estaba tratando de seguir todo el enfoque en capas, pero quizás, como otros han sugerido, el mejor lugar para manejar esto es en la vista. – user479808

Respuesta

5

Sí, el lugar para esto es en la vista.

Creo que el ejemplo anterior no funcionará; no puede iterar sobre un número entero.

numItems = request.GET.get('numItems') 

if numItems: 
    numItems = range(1, int(numItems)+1) 

return direct_to_template(request, "mytemplate.html", {'numItems': numItems}) 


{% for item in numItems %} 
{{ item }} 
{% endfor %} 
+0

Gracias por su respuesta pero obtengo el mismo resultado cuando lo intento así ... imagen 1 imagen 2 – user479808

+0

¿Puede publicar su código? Este código funciona Noté un pequeño error donde escribí 'range (1, int (rango) +1)' que debería ser 'range (1, int (numItems) +1)' (esto debería haber arrojado una excepción si trataste de ejecutarlo) De todas formas, si 'números' pasa a GET, crea una lista de enteros de 1 a 'numItems', y repite sobre ellos en la plantilla. –

+0

No estoy seguro de dónde publicarlo, así que editaré mi publicación original y la añadiré allí. ... – user479808

2

Debe agregar un código a su vista para descomprimir los parámetros GET y convertirlos a los valores que desee. Incluso si numItems fuera un número entero, la sintaxis que muestra no le daría el resultado que desea.

Prueba esto:

ctx = dict(request.GET) 
ctx['numItems'] = int(ctx['numItems']) 
response = render_to_string('persistConTemplate.html', ctx) 
+0

Gracias por su respuesta, pero obtengo el siguiente error cuando intento esto ... ctx ['numObjects'] = int (ctx ['numObjects']) KeyError: 'numObjects' – user479808

+0

Envuelva esa línea en 'if 'numObjects 'in ctx:' –

87

puede coaccionar a un str a un int usando el filtro de complemento

{% for item in numItems|add:"0" %} 

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#add

de coaccionar int a STR sólo tiene que utilizar slugify

{{ some_int|slugify }} 

EDIT: los que se dice , Estoy de acuerdo con los demás en que normalmente deberías hacer esto en la vista: usa estos trucos solo cuando el los nativos son mucho peores.

+0

esta fue la respuesta que necesitaba, gracias :) – simon

+0

Gracias. Tengo un dolor de cabeza trabajando con formularios. La captura estaba en el campo "clave externa".Cuando se carga desde el formulario "DB. .value" contiene enteros. Pero después de enviar "formulario. .value" son cadenas .... TADÁ! – darkless

+0

en lugar de hacer listas de comprensión en los identificadores ... ordenado. tan sencillo. – benzkji

14

me gusta hacer un filtro personalizado:

# templatetags/tag_library.py 

from django import template 

register = template.Library() 

@register.filter() 
def to_int(value): 
    return int(value) 

Uso:

{% load tag_library %} 
{{ value|to_int }} 

Es para los casos en que esto no se puede hacer fácilmente a la vista.

+3

Esto es mucho más limpio que el otro responde. –

0

Mi solución es una especie de truco y muy específica ..

En la plantilla quiero comparar con un porcentaje de 0,9, y nunca alcanza 1, pero todos los valores se consideran cadena en la plantilla, y no hay forma de convertir cadena en flotante.

Así que hice esto:

{% if "0.9" in value %} 
... 
{% else %} 
... 
{% endif %} 

Si quiero para detectar algún valor está más allá de 0,8, lo que hay que hacer:

{% if ("0.9" in value) or ("0.8" in value) %} 
... 
{% else %} 
... 
{% endif %} 

Este es un truco, pero es suficiente en mi caso. Espero que pueda ayudar a otros.

Cuestiones relacionadas