2011-03-18 49 views
11

Utilizo request.path para obtener la URL actual. Por ejemplo, si la URL actual es "/ test/foo/baz", quiero saber si comienza con una secuencia de cadena, supongamos/prueba. Si trato de usar:Obtenga la primera parte de una URL de la plantilla de Django

{% if request.path.startswith('/test') %} 
    Test 
{% endif %} 

consigo diciendo un error que no ha podido recorrer el resto de la expresión:

Could not parse the remainder: '('/test')' from 'request.path.startswith('/test')' 
Request Method: GET 
Request URL: http://localhost:8021/test/foo/baz/ 
Exception Type: TemplateSyntaxError 
Exception Value:  
Could not parse the remainder: '('/test')' from 'request.path.startswith('/test')' 
Exception Location: C:\Python25\lib\site-packages\django\template\__init__.py in __init__, line 528 
Python Executable: C:\Python25\python.exe 
Python Version: 2.5.4 
Template error 

Una solución sería la creación de una etiqueta personalizada para hacer el trabajo. ¿Hay algo más para resolver mi problema? La versión de Django utilizada es 1.0.4.

Respuesta

5

No se pueden pasar argumentos a las funciones normales de python desde una plantilla django. Para resolver su problema, necesitará una etiqueta de plantilla personalizada: http://djangosnippets.org/snippets/806/

3

No puede, por diseño, llamar funciones con argumentos de las plantillas de Django.

Un método fácil es poner el estado que necesita en su contexto de la petición, así:

def index(request): 
    c = {'is_test' : request.path.startswith('/test')} 
    return render_to_response('index.html', c, context_instance=RequestContext(request)) 

, entonces tendrá una variable is_test se puede utilizar en su plantilla:

{% if is_test %} 
    Test 
{% endif %} 

Este enfoque también tiene la ventaja de abstraer la prueba de ruta exacta ('/ prueba') de su plantilla, lo que puede ser útil.

0

Desde la sección de Filosofía en this page of Django docs:

el sistema de plantillas no ejecutará expresiones arbitrarias de Python

realmente se debe escribir una etiqueta personalizada o pasar una variable a informar a la plantilla si el la ruta comienza con '/test'

55

Puede usar el filtro de sector para obtener la primera parte de la url

{% if request.path|slice:":5" == '/test' %} 
    Test 
{% endif %} 

no puede probar esto ahora, y no saben si los filtros funcionan dentro 'si' etiqueta, si no funciona, puede utilizar el 'con' etiqueta

{% with request.path|slice:":5" as path %} 
    {% if path == '/test' %} 
    Test 
    {% endif %} 
{% endwith %} 
+0

Recibo una declaración 'if' con errores formateados incorrectamente. – Seitaridis

+2

funciona bien para mí – Ted

+0

¡Su primera solución funciona bien! :) –

22

En lugar de la comprobación de el prefijo con startswith, puede obtener lo mismo al verificar la membresía con la etiqueta integrada in.

{% if '/test' in request.path %} 
    Test 
{% endif %} 

Esto pasará casos en los que la cadena no es estrictamente en el principio, pero se puede evitar simplemente esos tipos de URL.

+0

Esto es lo que quería. ¡Gracias! Definitivamente la mejor respuesta aquí. –

+6

No funcionará en algunos casos si necesitamos encontrar si estamos en alguna sección de un sitio. Por ejemplo, necesitamos encontrar que estamos en la sección de "cursos". '/ courses/1 /' - OK, '/ login /? next =/courses/1 /' - no está bien. – Marboni

0

Yo uso el procesador de contexto en tal caso:

*. Crear archivo core/context_processors.py con:

def variables(request): 
     url_parts = request.path.split('/') 
     return { 
      'url_part_1': url_parts[1], 
     } 

*.Agregar registro:

'core.context_processors.variables', 

en settings.py a la lista de TEMPLATES 'context_processors'.

*. Utilice

{{ url_part_1 }} 

en cualquier plantilla.

Cuestiones relacionadas