Obtenga la primera parte de una URL de la plantilla de Django

Uso 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 cadenas, digamos / test. Si trato de usar:

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

Recibo un error que dice que no se pudo analizar el rest 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 crear 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.

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

Puedes usar el filtro de división para obtener la primera parte de la url

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

No puedo intentar esto ahora, y no sé si los filtros funcionan dentro de la etiqueta ‘if’, si no funciona, puedes usar la etiqueta ‘with’

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

En lugar de buscar el prefijo con startswith, puede obtener lo mismo al verificar la membresía con la etiqueta incorporada.

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

Esto pasará los casos donde la cadena no es estrictamente al principio, pero simplemente puede evitar esos tipos de URL.

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

Un enfoque fácil es poner el estado que necesita en el contexto de su solicitud, como este:

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

Luego tendrás una variable is_test que puedes usar en tu 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.

De la sección de Filosofía en esta página de Django docs :

El sistema de plantillas no ejecutará expresiones de Python arbitrarias.

Realmente deberías escribir una etiqueta personalizada o pasar una variable para informar a la plantilla si la ruta comienza con '/test'

Yo uso procesador de contexto en tal caso:

*. Crea el archivo core / context_processors.py con:

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

*. Añadir registro:

 'core.context_processors.variables', 

en settings.py a la lista TEMPLATES ‘context_processors’.

*. Utilizar

 {{ url_part_1 }} 

en cualquier plantilla.