urls tutorial parameter examples bootstrap html django django-templates url-encoding

html - tutorial - Codificación de URL en la plantilla de Django



href django (2)

En lugar de

{{ title }}

hacer

{{title|urlencode}}

Tengo este enlace de anclaje:

<a href="/question/tag/1/1/?list_id={{title}}">{{title}}</a>

A veces, este título tiene algún contenido con + (agregar operador) como: "Django + Python"

Pero cuando se coloca directamente en enlaces de anclaje, la url entregada será:

http://127.0.0.1:8080/question/tag/1/1/?list_id=Django + Python

Lo que eventualmente causará problemas en la recuperación ya que el decodificador url pensó que list_id GET = DjangoPython.

Entonces, ¿alguien sabe cómo evitar este problema? Tenga en cuenta que no quiero cambiar los enlaces de anclaje a los botones de entrada.


En lugar de codificar la URL y crear la cadena de consulta en la plantilla concatenando el elemento de contexto del título, considere simplificarlo un poco usando django.core.urlresolvers.reverse () y especificando una URL nombrada del archivo urls.py relevante. Lo convierte en un diseño limpio cuando no tiene que preocuparse por el cambio de URL. Imagine el dolor de cabeza de todos los HREF dispersos que tendría que cambiar, en lugar de simplemente asignar una variable de contexto desde el conjunto de vistas al resultado de la llamada inversa. La cadena de consulta también se puede agregar muy bien en la vista, sin tener que preocuparse por algunas de las reglas de análisis de plantillas a menudo extrañas. Tenga en cuenta que la función urllib.urlencode actúa de manera completamente diferente al filtro de plantilla del mismo nombre; no te confundas Se puede utilizar de la siguiente manera:

# If the entry in URLConf has named capture groups such as ?<pk>, # pass a dict as kwargs parameter instead. url = reverse(''your-named-url'', args=(1, 1)) # e.g ''/question/tag/1/1/'' # Encodes as form data to ''list_id=Django+%2B+Python'' querystring = urllib.urlencode({''list_id'': ''Django + Python''}) context[''question_url''] = ''{}?{}''.format(url, querystring)

Luego, en la plantilla puede ser tan simple como href="{{ question_url }}" . Puede parecer más trabajo, pero puede dar resultados muy rápidamente y es una separación de preocupaciones mucho mejor. Normalmente usaría la etiqueta de plantilla {% url "your-named-url" %} , pero actualmente no maneja las cadenas de consulta muy bien, como en, no de la misma manera que se trata de los argumentos de URL y kwargs definidos en URLConf.