Добавить скрипт на php на Django-сайт
Здравствуйте!
1. Есть сайт на питоне. Я в питоне не шарю.
2. Есть скрипт на php (Автономный собственно скрипт)
Надо php скрипт запустить на сайте. Вопрос, как мне их подружить?
Делаю так, скопировал папку со скриптом на хостинг. Подключил его файл index.php вот так
При подключении файла с параметрами из папки скрипта тем же способом, он просто вываливает на странице содержимое файла.
Добавлено через 1 минуту
меняет на
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Можно ли скрипт нейросети Python встроить в веб-сайт на Django?
Всем привет, нам дали задание встроить код нейросети в веб-сайт (можно воспользоваться Django).
Как добавить скрипт на сайт
Есть такая конструкция, закрывает окно. $(‘.block__close’).click(function()
Обратная связь — как правильно добавить на сайт готовый скрипт
Хочу на сайт установить обратную связь. Скачал болванку. Вопрос такой куда закачивать папку с.
как добавить в php скрипт дату заполнения
Я попробовал улучшить php скрипт для написания отзывов, но он меня не слушает. Сам скрипт рабочий.
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
Весьма странная задача. Прежде чем преступить к ее исполнению подумайте еще раз — это вам нужно? Нет ли другого пути решения. И только после этого пробуйте гуглить нечто вроде ‘php script in django site’ (именно англоязычный вариант наверно лучше сразу).
Регистрация: 22.12.2015
Сообщений: 34
Я понимаю, что идея бредовая. Но есть приложение(скрипт) на PHP который необходим на этом сайте. Питон я не знаю. Потому переписать скрипт в питоне идея еще более бредовая(ну как мне кажется)
Спасибо, буду искать.
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
А что за скрипт, если не очень большой, то я думаю не проблема будет его переписать
Регистрация: 22.12.2015
Сообщений: 34
Там приложение, сложное. но все равно спасибо)
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от levshaszr 
Там приложение, сложное
Ну ты расскажи нам, может мы чем и поможем.
Регистрация: 22.12.2015
Сообщений: 34
Спасибо ребят. Подключил пока так. Папку со скриптом кинул в папку WWW и на страницу вывел через iframe. Костыль. но время жмет. Все большое спасибо) когда станет поспокойнее вернусь к вопросу и нормально установлю.
@ muzqaymoq-com
levshaszr, это великолепный костыль =)) богом забытый iframe 😎
| Меню пользователя @ muzqaymoq-com |
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Нужно добавить в php скрипт функцию удаления учётной записи!
Здравствуйте! У меня есть php скрипт для регистрации пользователей на сайте, в котором нужно.
Напишу программу, сайт, скрипт (delphy, c++, VBA, asm, php, Javascript, jquery)
Пишу программы в Delphi, C/C++, VBA, интеграция с Microsoft Access, Word, Excel. PHP, MySQL.
Как подключить готовый скрипт из файла .py в django чтоб при нажатии срабатывал скрипт и отдавал ответ
Всем привет. Я учусь по видеоурокам и немного не понимаю как связать джанго и скрипты пайтона. Есть.
django-php: PHP в шаблонах Django
Смотрите, какая штука: django-php позволяет вам писать PHP-код прямо в шаблонах Django. Первая.
сайт php с базой на localhost (Нужно добавить возможность удаления — добавления в базу)
Всем доброго дня и с наступающим! Делаю курсовую "сайт php с базой MySQL на localhost" Не могу.
PHP скрипт -> Json -> выбор пользователя -> AJAX -> первоначальный PHP скрипт
Доброго времени суток! Я новичек вэб программировании, так что прошу строго не судить(в гугле.
Не работает скрипт JS в Django
Изначально я делал шаблон html,css — там скрипт JS работает (который подключается в конце кода).
Как запустить php код в шаблоне django
Установить
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.
Лучшая CTF площадка рунета Codeby Games Обучение кибербезопасности в игровой форме. Выполняй задания по кибербезопасности в формате CTF и получай бесценный опыт.
- Форум
- Developer Zone
- Языки программирования
- PHP/JS/HTML
- PHP — исходники
- Базовые решения
Шаблонизация — Python: Разработка на фреймворке Django
Веб-приложение состоит из веб-страниц. Даже если приложение реализует большую часть интерфейса пользователя с помощью JavaScript, домашняя страница все равно отдается сервером. Да и ситуации, когда страничный сайт хорошо решает поставленные задачи, возникают часто. Поэтому подсистема шаблонизации остается важной частью full-stack фреймворков.
В этом уроке разберем, что такое шаблонизация, и как на ее основе Django формирует HTML-страницы.
Язык шаблонизации
Шаблон — это почти готовый текстовый документ, в котором все неизменные части текста представлены как есть. А изменяемая часть описана на некотором языке с ветвлениями, условиями и циклами. Они позволяют преобразовать данные в подходящее представление. Этот язык называют языком шаблонизации или templating language.
На уровне шаблона разделяется ответственность. Шаблон страницы знает, как отобразить данные в виде HTML. А сами данные не зависят от этого представления и могут быть представлены по-разному разными шаблонами. По данным вообще нельзя сказать, что они будут представлены в виде HTML. Шаблонизатор возводит барьер абстракции.
Чтобы из кода, который формирует данные, не нужно было программировать отображение, у шаблонизатора есть свой язык программирования отображения. А для того, чтобы не было соблазна прямо в шаблоне получать данные, этот язык сделан с ограниченными возможностями.
Шаблонизация в Django
В Django шаблонизация проработана достаточно глубоко. Есть встроенный шаблонизатор, можно использовать сторонние шаблонизаторы вроде Jinja2 и можно сочетать несколько шаблонизаторов в одном проекте. Это удобно, когда некоторые шаблоны достаются в наследство, либо когда мы переезжаем с одного шаблонизатора на другой.
Чтобы шаблон превратить в результат, Django использует бэкенды. Встроенных бэкенда два: DjangoTemplates и Jinja2. Сторонние пакеты могут предоставлять свои бэкенды.
Чтобы бэкенд мог что-то сделать с шаблоном, нужно этот шаблон где-то взять. Django самостоятельно загружает шаблоны из файлов, знает, где эти файлы найти, и запоминает/кэширует часто используемые шаблоны в памяти. Нам остается только помнить имя шаблона, который хотим использовать в данный момент.
Настраивается это в settings.py с помощью переменной TEMPLATES . Выглядит настройка так:
TEMPLATES = [ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': False, 'OPTIONS': # . параметры шаблонизатора . >, >, ]
- DIRS — параметр, который перечисляет директории, где будет производиться поиск шаблонов
- APP_DIRS — параметр, который разрешает Django искать шаблоны в директориях приложений
Когда APP_DIRS включен, в каждом подключенном приложении будут по умолчанию искаться директории templates, а в них — шаблоны.
По умолчанию в качестве директории с шаблонами принято указывать templates:
# hexlet_django_blog/settings.py from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES = [ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, 'OPTIONS': # . параметры шаблонизатора . >, ]
Шаблоны приложений
У одного приложения в нашем учебном проекте уже есть шаблон. Речь идет о главном приложении hexlet_django_blog и шаблоне hexlet_django_blog/templates/index.html . Django находит и загружает этот шаблон, потому что опция APP_DIRS включена по умолчанию.
Если сейчас создать новый шаблон hexlet_django_blog/articles/templates/index.html , то при поиске по имени index.html первым будет найден старый шаблон hexlet_django_blog/templates/index.html . Так происходит, потому что приложение hexlet_django_blog находится в списке settings.INSTALLED_APPS выше приложения hexlet_django_blog.article . Если переставить приложения местами, то загрузчик шаблонов учтет изменения.
С помощью управления порядком подключения приложений можно переопределять шаблоны одних приложений шаблонами из других. Это интересная возможность, но из-за нее же приходится следить за тем, чтобы шаблоны не перепутывались случайно.
Чтобы не думать слишком много над тем, как не путать шаблоны, стоит придерживаться правила:
Все шаблоны проекта, которые используются только в нем, стоит хранить в отдельной директории в корне проекта и держать эту директорию в порядке — использовать поддиректории и хорошие имена. Директорию нужно добавить в settings.TEMPLATES.DIRS .
Для тех же приложений, которые планируется использовать повторно, внутри соответствующей директории templates нужно иметь поддиректорию с именем приложения и все шаблоны располагать в ней. Это уменьшит вероятность конфликтов имен шаблонов.
Контекст шаблонизации
Шаблоны превращаются в текст с помощью выполнения кода на языке шаблонизатора. Этот код обычно подразумевает использование каких-то данных, получаемых вне шаблона. Данные передаются в шаблон с помощью контекста, который представляет собой словарь. Когда мы вызываем render(request, ‘template.html’, context=<>) , мы передаем этот самый словарь в качестве аргумента.
Часто возникает задача иметь в контексте шаблона доступ к параметрам запроса или настройкам проекта. Передавать такие вещи явно слишком утомительно, поэтому у Django есть механизм Context Processors — посредники между нами и шаблоном, которые расширяют контекст единым образом для всех шаблонов.
Процессоры контекста вызываются как функции, которые получают в качестве аргумента request и возвращают словарь. Затем этот словарь дополняет предоставленный нами контекст. Подключаются context processors в settings.TEMPLATES.OPTIONS.context_processors — это список строк с полными именами процессоров.
С Django поставляется много готовых процессоров контекста. Вот два примера:
- django.template.context_processors.request добавляет в контекст переменную request с очевидным значением
- django.template.context_processors.debug добавляет переменную debug , которая истинна, если сервер запущен в режиме разработчика. С помощью этой переменной можно выводить какую-то отладочную информацию, которая не будет видна в боевом режиме
В дополнение к встроенным можно создавать и свои процессоры контекста или же брать их из сторонних библиотек.
Работа с шаблонизатором Django
Пример простого Django-шаблона:
h1> <title >>h1> p> <description >>p> pre> <code >> pre> p>Question submitted at: <created_at >>p>
Шаблон выглядит как HTML, но со вставками кода. Во многом встроенный Django шаблонизатор схож с шаблонизатором Jinja2 — подстановка любого значения выполняется в двойных фигурных скобках > . Это очень похоже на интерполяцию, если сам шаблон рассматривать как строку.
Под капотом Django выполняет дополнительную обработку и экранирует любые данные, которые вставлены таким образом. Это значит, что нам не нужно прилагать дополнительные усилия, чтобы обеспечить безопасность в шаблонах.
Данные в шаблон поступают из вью в виде контекста:
# hexlet_django_blog/views.py def about(request): tags = ['обучение', 'программирование', 'python', 'oop'] return render( request, 'about.html', context='tags': tags>, )
!-- hexlet_django_blog/templates/about.html --> h1>О блогеh1> p>Эксперименты с Django на Хекслетеp> p> <tags|join:', ' >>p>
Двойные фигурные скобки позволяют не только выводить информацию, которую передали в контексте, но и производить ее простую обработку при помощи встроенных тегов и фильтров шаблонов. Главное правило — не злоупотреблять. В основном данные должны быть подготовлены в обработчике до того, как они попадут в шаблон. Тут нужно помнить: шаблоны — про отображение, а не про логику работы.
Кроме подстановки во встроенном шаблонизаторе есть инструкции. С их помощью реализованы все управляющие конструкции, например, циклы, условия и многое другое:
% if records|len == 1 %> I have one record! % endif %> % for user in users %> p>This is user <user.id >>p> % endfor %>
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Язык шаблонов Django¶
Этот раздел описывает синтаксис языка шаблонов Django. Если вы ищете технически подробности как он работает и как расширять его, смотрите Язык шаблонов Django: для Python программистов.
Язык шаблонов Django представляет баланс между возможностями и простотой. Он создавался, чтобы быть удобным для пользователей HTML. Если у вас есть опыт работы с другими языками текстовых шаблонов, таких как Smarty или Jinja2, вы должны себя чувствовать как дома с шаблонами Django.
Если у вас есть опыт программирования или вы использовали PHP, который позволяет интегрировать программный код прямо HTML, вам стоит помнить, что система шаблонов Django – это не просто Python встроенный в HTML. Это сделано намеренно: шаблоны предназначены для представления, а не для реализации логики программы.
Шаблоны Django предоставляют теги, которые повторяют некоторые структуры языка программирования – тег if для проверки на истинность, тег for для циклов, и др. – но они не выполняются непосредственно как код Python, и система шаблонов не будет выполнять произвольное выражение Python. Только теги, фильтры и синтаксис, перечисленные ниже, поддерживаются по умолчанию (хотя вы можете добавить собственное расширение для языка шаблонов при необходимости).
Шаблоны¶
Шаблон это просто текстовый файл. Он позволяет создать любой текстовый формат (HTML, XML, CSV, и др.).
Шаблон содержит переменные, которые будут заменены значениями при выполнении шаблона, и теги, которые управляют логикой шаблона.
Ниже приводится простой шаблон, который иллюстрирует некоторые основы. Каждый элемент будет объяснен далее в этом разделе.
extends "base_generic.html" %> block title %> section.title >> endblock %> block content %> section.title >> for story in story_list %> href=" story.get_absolute_url >>"> story.headline|upper >> story.tease|truncatewords:"100" >> endfor %> endblock %>
Зачем использовать текстовый шаблон, а не на основе XML (как TAL в Zope)? Мы хотели, чтобы шаблоны Django были больше, чем просто XML/HTML шаблоны. На World Online, мы используем их для email, JavaScript и CSV. Вы можете использовать шаблоны для любого текстового формата.
Ах да, еще одно: заставлять людей редактировать XML – это садизм!
Переменные¶
Переменные выглядят таким образом: > . Когда шаблон встречает переменную, он вычисляет ее и заменяет результатом. Названия переменных могут состоять из букв, цифр и нижнего подчеркивания( "_" ). Точку ( "." ) также можно использовать, но она имеет особый смысл описанный ниже. Важно, нельзя использовать пробелы и знаки пунктуации в названии переменных.
Используйте точку ( . ) для доступа к атрибутам переменной.
Технически, когда шаблон встречает точку, он пытается получить значения в таком порядке:
- Ключ словаря
- Атрибут или метод
- Индекс списка
Если найден вызываемый объект(функция или метод), он будет вызван без аргументов. Результат будет использоваться шаблоном как значение.
Это может приводить к неожиданным результатам с объектами, которые переопределяют поиск по словарю. Например, рассмотрим следующий код, который пытается выполнить цикл по collections.defaultdict :
for k, v in defaultdict.iteritems %> Do something with k and v here. endfor %>
Так как поиск словаре происходит вперёд, такое поведение предоставляет значение по умолчанию вместо использования метода .iteritems() . В данном случае, сначала рассмотрим преобразование в словарь.
В примере выше, > будет заменен на атрибут title объекта section .
Если переменная не найдена, шаблон вставит значение опции string_if_invalid , которая равна '' (пустой строке) по-умолчанию.
Следует отметить, что “bar” в шаблонном выражении выглядит как > и будет интерпретирован как строка. Если в шаблонном контексте определена переменная с таким именем, то значение локальной переменной “bar” будет проигнорировано.
Фильтры¶
Вы можете изменить значение переменной используя фильтры.
Фильтры выглядят таким образом: > . Это выведет значение переменной > после применения фильтра lower к нему, который преобразует значение в нижний регистр. Используйте символ ( | ) для применения фильтра.
Можно использовать “цепочку” фильтров. Вывод одного фильтра используется для другого. > обычно применяется для экранирования текста, и замены переноса строки тегами .
Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит таким образом: > . Этот код отобразит первые 30 слов переменной bio .
Аргументы фильтров, которые содержат пробелы, должны быть заключены в кавычки. Например, чтобы объединить список пробелом и запятой, используйте > .
Django предоставляет около шестидесяти встроенных фильтров. Вы можете прочитать о них в разделе о встроенных фильтрах. Чтобы дать вам представление о возможностях, вот некоторые из наиболее часто используемых фильтров:
Если значение равно False или пустым, будет использовано значение по умолчанию. В противном случае используется значение. Например:
value|default:"nothing" >>
Если value равно "" (пустая строка), будет выведено nothing .
Возвращает размер значения. Работает для строк и списков, например:
value|length >>
Форматирует размер файла в читабельный вид (например, '13 KB' , '4.1 MB' , '102 bytes' , и т.д.). Например:
value|filesizeformat >>
Если value равно 123456789, выведет 117.7 MB .
Опять же, это всего лишь несколько примеров; полный список смотрите раздел о встроенных фильтрах.
Вы можете создать собственный фильтр; смотрите Собственные шаблонные теги и фильтры.
Интерфейс администратора Django может предоставить полный список доступных тегов и фильтров. Смотрите The Django admin documentation generator.
Теги¶
Теги выглядят таким образом: . Теги сложнее чем переменные: одни создают текст для вывода, влияют на выполнение используя условия и циклы, другие загружают дополнительную информацию в шаблоны, чтобы использовать ее далее через переменные.
Некоторые теги требуют открывающий и закрывающий теги (например, . содержимое тега . ).
Django содержит около двадцати встроенных тегов. Вы можете прочитать все о них в разделе о встроенных тегах. Чтобы дать вам представление о возможностях, вот некоторые из наиболее часто используемых тегов:
Цикл по каждому элементу массива. Например, выведем список спортсменов из athlete_list :
for athlete in athlete_list %> athlete.name >> endfor %>
if , elif , и else
Вычисляет переменную и если она равна “true”, выводит содержимое блока:
if athlete_list %> Number of athletes: athlete_list|length >> elif athlete_in_locker_room_list %> Athletes should be out of the locker room soon! else %> No athletes. endif %>
В примере выше, если athlete_list не пустой, будет отображено количество спортсменов > . Иначе, если athlete_in_locker_room_list не пустой, будет показано сообщение “Athletes should be out. ”. Если оба списка пустые, будет показано сообщение “No athletes.”.
Вы можете использовать фильтры и операторы в теге if tag:
if athlete_list|length > 1 %> Team: for athlete in athlete_list %> . endfor %> else %> Athlete: athlete_list.0.name >> endif %>
Несмотря на работоспособность вышеупомянутого примера, помните, что большинство шаблонных фильтров возвращает строки, таким образом, математическое сравнение результатов фильтров в общем случае будет работать не так, как вы можете ожидать. Хотя : tfilter: length является исключением.
Определяет наследование шаблонов (смотрите ниже), эффективный способ использовать шаблоны.
Опять же, это только несколько тегов; полный список смотрите в разделе о встроенных тегах.
Интерфейс администратора Django может предоставить полный список доступных тегов и фильтров. Смотрите The Django admin documentation generator.
Комментарии¶
Чтобы закомментировать строку в шаблоне, используйте синтаксис комментариев: .
Например, этот шаблон выведет 'hello' :
hello
Комментарий может содержать любой код шаблона, правильный или нет. Например:
Этот синтаксис может быть использован только для однострочных комментариев (нельзя использовать перенос строки между и #> ). Если вам нужно закомментировать несколько строк, используйте тег comment .
Наследование шаблонов¶
Самая могущественная – и, следовательно, самая сложная – часть механизма шаблонов Django – это наследование шаблонов. Наследование шаблонов позволяет создать вам шаблон-“скелет”, который содержит базовые элементы вашего сайта и определяет блоки, которые могут быть переопределены дочерними шаблонами.
Проще всего понять наследования шаблонов с помощью примера:
Этот шаблон, который мы будем называть base.html , определяет HTML структуру документа, которую вы можете использовать для двух-колоночной страницы. Задача “дочернего” шаблона заполнить пустые блоки содержимым.
В этом примере, тег block определяет три блока, которые может переопределить дочерний шаблон. Все что делает тег block – указывает механизму шаблонов, какая часть шаблона может быть переопределена в дочернем шаблоне.
Дочерний шаблон может выглядеть таким образом:
extends "base.html" %> block title %>My amazing blog endblock %> block content %> for entry in blog_entries %> entry.title >> entry.body >> endfor %> endblock %>
Ключевым здесь есть тег extends . Он говорит механизму шаблонов, что этот шаблон “наследует” другой шаблон. Когда механизм шаблонов выполняет этот шаблон, первым делом находится родительский шаблон – в этом примере “base.html”.
Далее механизм шаблонов находит три тега block в base.html и заменяет их содержимым дочернего шаблона. В зависимости от значения blog_entries , результат может выглядеть таким образом:
Так как дочерний шаблон не определяет блок sidebar , будет использовано значение из родительского шаблона. Содержимое тега родительского шаблона всегда используется как значение по умолчанию.
Вы можете использовать столько уровней наследование, сколько вам нужно. Один из распространенных способов использовать наследование – это трехуровневый подход:
- Создать шаблон base.html , который отображает основной вид вашего сайта.
- Создать шаблон base_SECTIONNAME.html для каждого “раздела” вашего сайта. Например, base_news.html , base_sports.html . Все эти шаблоны наследуют base.html и включают стили и дизайн специфические для конкретного раздела.
- Создание шаблона для каждого типа страницы, такие как новость или запись в блоге. Эти шаблоны наследуют соответствующий шаблон раздела.
Такой подход позволяет максимально использовать существующий код и легко добавлять элементы, такие как элементы навигации специфические для каждого раздела, в общие блоки шаблона.
Вот несколько советов по работе с наследованием:
block content %> . endblock content %>
Вы не можете определить несколько тегов block с одним названием в одном шаблоне. Такое ограничение существует потому, что тег block работает в “оба” направления. block не просто предоставляет “полость” в шаблоне – он определяет содержимое, которое заполняет “полость” в родительском шаблоне. Если бы было несколько тегов block с одним названием, родительский шаблон не знал содержимое какого блока использовать.
Автоматическое экранирование HTML¶
Создавая HTML используя шаблон, есть риск, что переменная может содержать символы, которые повлияют на структуру полученного HTML. Например, рассмотрим такой фрагмент:
Hello, name >>
На первый взгляд это кажется безобидным способом отображения имени пользователя, но давайте посмотрим, что произойдет, если пользователь выбрал такое имя::
alert('hello')
С таким именем шаблон вернет:
Hello, alert('hello')
. что приведет к отображению alert-окна JavaScript!
Аналогично, что если имя содержит символ ' ?
username
Шаблон вернет такое содержимое:
Hello, username
. в результате оставшееся содержимое страницы будет выделено полужирным!
Очевидно, пользовательским данными нельзя слепо доверять и вставлять непосредственно в содержимое страницы, так как злоумышленники могут использовать это с плохими намерениями. Такой тип уязвимости называется Cross Site Scripting (XSS) атакой.
Чтобы избежать этой проблемы, у вас есть два варианта:
- Первый, вы можете применять ко всем сомнительным переменным фильтр escape (описанный далее), который преобразует потенциально опасные HTML символы в безопасные. Такое решение было принятым в первых версиях Django, но проблема в том, что оно возлагает бремя ответственности за безопасность на вас, разработчика / автора шаблона. Легко забыть экранировать переменную.
- Второй, вы можете позволить Django автоматически экранировать HTML. Оставшаяся часть этого раздела описывает, как автоматическое экранирование работает.
По-умолчанию в Django, каждый шаблон экранирует все переменные. В частности выполняются такие замены:
- заменяется на <
- > заменяется на >
- ' (одинарная кавычка) заменяется на '
- " (двойная кавычка) заменяется на "
- & заменяется на &
Опять же, мы подчеркиваем, что такое поведение используется по умолчанию. Если вы используете систему шаблонов Django, вы в безопасности.
Как это отключить¶
Если вы не хотите, чтобы данные автоматически экранировались, на уровне сайта, шаблона или одной переменной, вы можете отключить это несколькими способами.
Зачем вам отключить экранирование? Потому что в некоторых ситуациях, вы намеренно добавляете HTML в переменную, и хотите, чтобы он выводился без экранирования. Например, вы можете хранить HTML в базе данных и хотите непосредственно вставить его в содержимое страницы. Или шаблоны Django используются для создания текста, который не является HTML – например email.
Для отдельных переменных¶
Для отключения авто-экранирования для отдельных переменных, используйте фильтр safe :
This will be escaped: data >> This will not be escaped: data|safe >>
Думайте о safe как сокращение “обезопасить от последующего экранирования” или “может быть смело интерпретировано как HTML”. В этом примере, если data содержит '' , будет выведено:
This will be escaped: <b> This will not be escaped:
Для блоков шаблона¶
Для контроля авто-экранирования в шаблоне, “оберните” шаблон (или часть шаблона) тегом autoescape , например:
autoescape off %> Hello name >> endautoescape %>
Тег autoescape в качестве аргумента принимает on или off . В некоторых случаях, вы захотите включить экранирование в шаблоне, в котором оно было отключено. Например:
Auto-escaping is on by default. Hello name >> autoescape off %> This will not be auto-escaped: data >>. Nor this: other_data >> autoescape on %> Auto-escaping applies again: name >> endautoescape %> endautoescape %>
Тег autoescape распространяет свой эффект на шаблоны, которые наследуют текущий, и на включенные тегом include шаблоны, как и другие блочные теги. Например:
autoescape off %> block title %> endblock %> block content %> endblock %> endautoescape %>
extends "base.html" %> block title %>This & that endblock %> block content %> greeting >> endblock %>
Так как авто-экранирование отключено в базовом шаблоне, оно будет отключено и в дочернем шаблоне. Если переменная greeting равна Hello! , будет выведено:
This & that Hello!
Заметки¶
Обычно, авторы шаблонов не должны волноваться про авто-экранирование. Разработчики на стороне Python (те, кто создает представления и фильтры) должны определять в каких случаях данные не должны экранироваться и помечать их соответствующим образом, так что все будет просто работать в шаблонах.
Если вы создаете шаблон, который может использовать как с включенным авто-экранированием так и без него, добавляйте фильтр escape для каждой переменной, которую нужно экранировать. При включенном авто-экранировании фильтр escape не выполнит замену символов повторно.
Строки и автоматическое экранирование¶
Как уже упоминалось выше, аргументом фильтра может быть строка:
data|default:"This is a string literal." >>
Все строки в шаблоне вставляются без автоматического экранирования – они обрабатываются как строки, к которым применили фильтр safe . Причина этого состоит в том, что автор шаблона контролирует содержимое этих строк и самостоятельно может убедиться при создании шаблона, что они не содержат не безопасных символов.
Это означает, чтобы вы должны писать:
data|default:"3 < 2" >>
data|default:"3 < 2">>
Это правило не распространяется на переменные, которые используются в качестве аргументов, так как автор шаблоне не может контролировать содержимое этих переменных.
Вызов методов¶
Вызов большинства методов объектов также доступен в шаблоне. Это означает, что шаблон имеет доступ не только к атрибутам классов (например, название поля) и переменных переданных из представлениях. Например, Django ORM предоставляет “entry_set” атрибут для получения связанных через внешний ключ объектов. Следовательно, для модели комментариев(“comment”) с внешним ключом на модель задач(“task”) вы можете обратиться в цикле ко всем связанным комментариям переданного объекта задачи:
for comment in task.comment_set.all %> comment >> endfor %>
Также, QuerySets предоставляет метод count() для получения количества объектов. Следовательно, вы можете получить количество комментариев связанных с конкретной задачей:
task.comment_set.all.count >>
И конечно вы можете использовать методы вашей модели:
class Task(models.Model): def foo(self): return "bar"
template.html
task.foo >>
Так как Django намеренно ограничивает определение логики проекта в шаблоне, передавать аргументы при вызове метода в шаблоне нельзя. Данные должны вычисляться в представлении и передаваться в шаблон для отображения.
Собственные библиотеки тегов и фильтров¶
Некоторые приложения предоставляют собственные библиотеки тегов и фильтров. Чтобы использовать их в шаблоне, укажите приложение в INSTALLED_APPS (в нашем примере мы используем 'django.contrib.humanize' ), затем используйте тег load :
load humanize %> 45000|intcomma >>
В это примере, тег load загружает библиотеку humanize , которая предоставляет тег intcomma . Если вы активировали django.contrib.admindocs , в разделе документации вашего интерфейса администратора вы можете найти список всех установленных библиотек.
Тег load может принимать названия нескольких библиотек, разделенные пробелом. Например:
load humanize i18n %>
Смотрите раздел Собственные шаблонные теги и фильтры, чтобы узнать как создавать собственные библиотеки для шаблонов.
Собственные библиотеки и наследование шаблонов¶
При загрузке библиотеки, теги и фильтры, которые она содержит, будут доступны только в текущем шаблоне – не в родительском или дочернем шаблонах.
Например, если шаблон foo.html содержит , дочерний шаблон (например, содержащий````) не сможет использовать теги и фильтры из этой библиотеки. Дочерний шаблон должен самостоятельно загрузить библиотеку, используя .
Так сделано ради “maintainability” и “sanity”.
Описывает встроенные теги, фильтры, использование сторонних шаблонизатор, язык шаблонов и другое.
