Получить первую часть URL из шаблона Django - PullRequest
12 голосов
/ 18 марта 2011

Я использую request.path для получения текущего URL.Например, если текущий URL-адрес «/ test / foo / baz», я хочу знать, начинается ли он с последовательности строк, скажем, / 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.

Ответы [ 6 ]

57 голосов
/ 18 марта 2011

Вы можете использовать фильтр слайсов, чтобы получить первую часть URL

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

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

{% with request.path|slice:":5" as path %}
  {% if path == '/test' %}
    Test
  {% endif %} 
{% endwith %} 
26 голосов
/ 08 августа 2012

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

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

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

5 голосов
/ 18 марта 2011

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

3 голосов
/ 18 марта 2011

По замыслу, вы не можете вызывать функции с аргументами из шаблонов 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') от вашего шаблоначто может быть полезным.

0 голосов
/ 20 января 2017

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

*. Создайте файл 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 в список ШАБЛОНОВ "context_processors".

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

{{ url_part_1 }}

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

0 голосов
/ 18 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...