Ответ 1
Вы не можете передавать аргументы в обычные функции python из шаблона django. Чтобы решить вашу проблему, вам понадобится специальный тег шаблона: http://djangosnippets.org/snippets/806/
Я использую 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.
Вы не можете передавать аргументы в обычные функции python из шаблона django. Чтобы решить вашу проблему, вам понадобится специальный тег шаблона: http://djangosnippets.org/snippets/806/
Вы можете использовать фильтр среза для получения первой части URL
{% if request.path|slice:":5" == '/test' %}
Test
{% endif %}
Не могу попробовать это сейчас и не знаю, работают ли фильтры внутри тега if, если не работает, вы можете использовать тег 'with'
{% with request.path|slice:":5" as path %}
{% if path == '/test' %}
Test
{% endif %}
{% endwith %}
Вместо того, чтобы проверять префикс с помощью startswith, вы можете получить то же самое, проверив членство со встроенным тегом in
.
{% if '/test' in request.path %}
Test
{% endif %}
Это приведет к тому, что строка не будет строго в начале, но вы можете просто избежать этих типов URL-адресов.
Вы не можете, по дизайну, вызывать функции с аргументами из шаблонов 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') из вашего шаблона, что может быть полезно.
В разделе "Философия" в этой странице Django docs:
система шаблонов не будет выполняться произвольные выражения Python
Вы действительно должны написать собственный тег или передать переменную, чтобы сообщить шаблон, если путь начинается с '/test'
Я использую контекстный процессор в таком случае:
*. Создайте файл 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 }}
в любом шаблоне.