Получить первую часть URL-адреса из шаблона Django

Я использую request.path для получения текущего URL-адреса. Например, если текущий URL-адрес "/test/foo/baz", я хочу знать, начинается ли он с последовательности строк, пусть say/test. Если я попытаюсь использовать:

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

Я получаю сообщение об ошибке, говоря, что он не смог разобрать оставшуюся часть выражения:

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

Одним из решений было бы создание пользовательского тега для выполнения задания. Есть ли что-то еще для решения моей проблемы? Используемая версия Django 1.0.4.

Ответ 1

Вы не можете передавать аргументы в обычные функции python из шаблона django. Чтобы решить вашу проблему, вам понадобится специальный тег шаблона: http://djangosnippets.org/snippets/806/

Ответ 2

Вы можете использовать фильтр среза для получения первой части URL

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

Не могу попробовать это сейчас и не знаю, работают ли фильтры внутри тега if, если не работает, вы можете использовать тег 'with'

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

Ответ 3

Вместо того, чтобы проверять префикс с помощью startswith, вы можете получить то же самое, проверив членство со встроенным тегом in.

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

Это приведет к тому, что строка не будет строго в начале, но вы можете просто избежать этих типов URL-адресов.

Ответ 4

Вы не можете, по дизайну, вызывать функции с аргументами из шаблонов Django.

Один простой подход заключается в том, чтобы указать состояние, которое вам нужно в контексте запроса, например:

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

Затем у вас будет переменная is_test, которую вы можете использовать в своем шаблоне:

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

Этот подход также имеет преимущество абстрагирования точного теста пути ('/test') из вашего шаблона, что может быть полезно.

Ответ 5

В разделе "Философия" в этой странице Django docs:

система шаблонов не будет выполняться произвольные выражения Python

Вы действительно должны написать собственный тег или передать переменную, чтобы сообщить шаблон, если путь начинается с '/test'

Ответ 6

Я использую контекстный процессор в таком случае:

*. Создайте файл core/context_processors.py с помощью:

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

*. Добавить запись:

'core.context_processors.variables',

в settings.py в список контекстных_процессоров TEMPLATES.

*. Используйте

{{ url_part_1 }}

в любом шаблоне.