Etiqueta de plantilla de Django para insertar o reemplazar el parámetro de URL

¿Alguien está al tanto de una etiqueta de plantilla de Django que toma la ruta actual y la cadena de consulta e inserta o reemplaza un valor de cadena de consulta?

Por ejemplo, ¿ha recibido una solicitud para / some / custom / path? q = how + now + brown + cow & page = 3 & filter = person

La llamada {% urlparam 'page' 4 %} generaría /some/custom/path?q=how+now+brown+cow&page=4&filter=person .

Esto no sería demasiado difícil de escribir desde cero, pero como parece ser una tarea muy común, espero que se incorpore una etiqueta como esta. Sin embargo, después de leer los documentos y buscar en Google, parece que no puedo encontrar a nadie que haya publicado esa etiqueta.

Como no he usado estas herramientas por mi cuenta, solo te recomendaré:

  • django-url-tools tiene una etiqueta de plantilla url_params que parece hacer lo que quieres
  • django-more-template-tags-and-filters tiene algunas tags de ayuda para manipular urls y parámetros

Para su información, personalmente he usado la biblioteca jsurl para este tipo de manipulaciones de url en javascript.

Espero que ayude.

Así es como lo hice en un proyecto Django 1.3. Como usted esperaba encontrar esto integrado, pero terminé codificándolo en la vista:

 def remove_url_param(url, params): if not isinstance(params, list): params = [params,] if isinstance(url, unicode): # urlencode doesn't like unicode url = url.encode('utf8') (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url) param_dict = parse_qs(query) for p in params: try: del(param_dict[p]) except KeyError: pass query = urllib.urlencode(param_dict, True) return urlparse.urlunsplit((scheme, netloc, path, query, fragment)) 

Luego utilicé esto para crear URL base:

 page_url_unordered = putils.remove_url_param( request.get_full_path(), ['order', 'ajax'] ) 

Luego en la plantilla:

 Price Size 

Quiero hacer una serie de enlaces de paginación en una página de búsqueda. La URL contiene varios parámetros de consulta (como en mi ejemplo). El código de paginación que representa los enlaces de paginación no debería tener que tener explícitamente todos estos parámetros. El administrador de Django parece tener este comportamiento en todas partes.

Esto se habilita agregando django.core.context_processors.request a TEMPLATE_CONTEXT_PROCESSORS (no está habilitado de forma predeterminada). Esto agregará una variable de request a sus plantillas, que es el objeto HttpRequest .

Desde allí, puede usar {{ request.get_full_path }} para obtener la URL actual con la cadena de consulta completa y, a continuación, adjuntar su consulta personalizada.

Si su página es /search?q=foo+bar , y desea que aparezca un nuevo enlace /search?q=foo+bar&page=4 , page 4 .