python - tutorial - django urls
Etiqueta de plantilla Django para insertar o reemplazar el parĂ¡metro URL (3)
¿Alguien conoce 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, una solicitud a / some / custom / path? q = cómo + ahora + 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 muy difícil de escribir desde cero, pero como esto parece una tarea muy común, esperaría que una etiqueta como esta esté incorporada. Sin embargo, después de leer los documentos y buscar en Google, parece que no puedo encontrar a nadie que haya publicado una etiqueta de ese tipo.
Quiero presentar 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 debe 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 manera 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 luego agregar su consulta personalizada a la misma.
Si su página es /search?q=foo+bar
, y quiere que un nuevo enlace sea /search?q=foo+bar&page=4
, <a href="{{ request.get_full_path }}&page=4">page 4</a>
.
Así es como lo hice en un proyecto de Django 1.3. Al igual que 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 usé esto para crear URL base:
page_url_unordered = putils.remove_url_param( request.get_full_path(), [''order'', ''ajax''] )
Luego en la plantilla:
<a href="{{ page_url_unordered }}&order=price">Price</a>
<a href="{{ page_url_unordered }}&order=size">Size</a>
Como no he usado estas herramientas solo, solo lo referiré a usted:
- django-url-tools tiene una etiqueta de plantilla url_params que parece hacer lo que quieras
- django-more-template-tags-and-filters tiene algunas etiquetas auxiliares para manipular URL y parámetros
FYI, personalmente he usado la biblioteca jsurl para este tipo de manipulaciones de URL en javascript.
Espero que ayude.