Как сделать комментарии django

Добавил пользователь Alex
Обновлено: 04.10.2024

Декоратор — это название одного из самых популярных шаблонов проектирования, используемых в настоящее время, хотя часто мы используем его, не зная, что это именно шаблон проектирования. А что такого особенного в этом шаблоне? Как мы можем прочитать в Python Wiki, это способ явно изменить поведение объекта, заключив его в декорируемый объект с аналогичным интерфейсом. Вы можете почитать больше о дизайне паттернов здесь.

Почему я должен использовать декораторы в своем веб-приложении?

Декораторы динамически изменяют функциональность функции, метода или класса без необходимости создавать подклассы или изменять исходный код декорированного класса. Благодаря этому наш код будет более чистым, более читаемым, удобным в обслуживании (что немаловажно), что позволит нам добавлять функциональность к нескольким классам с помощью одного метода.

Хороший пример важности и простоты использования этих декораторов можно увидеть в декораторе @login_required, который предоставляет django, и который вы, вероятно, использовали, если у вас есть некоторый опыт работы с нашим любимым фреймворком. Это всего лишь фрагмент кода, в котором мы проверяем, аутентифицирован ли пользователь, и перенаправляем его если нет на URL-адрес логирования.

Декораторы используются следующим образом:

Каждый раз, когда пользователь пытается получить доступ к my_view, запускается код внутри login_required.

Некоторые из наших любимых декораторов

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

Group Required

Иногда нам нужно защитить некоторые представления, чтобы позволить определенной группе пользователей получить к ним доступ. Вместо того, чтобы проверять, принадлежит ли пользователь к этой группе/группам, мы можем использовать следующий декоратор

Вы можете прочитать о нем более подробно здесь.

Anonymous required

Вы можете почитать о нем здесь.

Superuser required

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

Вы можете почитать более подробно здесь.

Ajax required

Этот декоратор проверяет, является ли запрос запросом AJAX. Этот декоратор, используется когда мы работаем с Javascript фреймворками такими как jQuery.

Вы можете почитать более подробно здесь.

Time it

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

Вы можете почитать более подробно здесь.

Пользовательские функции

Следующий декоратор — это просто пример того, как вы можете легко и на 100% настраивать некоторые разрешения или проверки.

Представьте, что у вас есть блог, магазин, форум … Если пользователям нужно набрать определенное количество баллов, чтобы написать отзыв, например, что бы избежать спама. Мы создадим декоратор, чтобы проверить, что пользователь вошел в систему и набрал более 10 баллов, чтобы он мог написать отзыв, в противном случае мы поднимем Forbidden

В материале описываются основные приемы работы с Python-фреймворком Django. Изложение ведется на примере создания простого проекта на Django. Проект представляет собой электронный журнал со списком записей или тем. Каждая запись в свою очередь может также содержать вложенные записи или заметки. Для создания/редактирования/удаления записей и пользователей используется готовая админ-панель Django. В данном проекте ограничением для пользователей является то, что они могут создавать записи только от своего имени. Для создания материала использовался Django версии 2.2.

В материале 3 раздела: в первом описывается процесс создания законченного проекта на Django, в принципе, для понимания основ работы с фреймворком на нем можно и остановиться. Последующие 2 добавляют стили и описывают некоторые дополнительные приемы работы с пользователями.

Содержание:

Создание проекта

Создадим папку с названием проекта, например log. В этой папке нужно создать виртуальное окружение. Для этого воспользуемся командой: После чего созданное виртуальное окружение нужно активировать, для этого в разных ОС используются разные команды.
Для Linux и OS X: Для Windows: Далее нужно установить фреймворк в это виртуальное окружение, с помощью команды: После того как Django установится, создадим новый проект с помощью команды: После этого будет создана новая папка log, в которую надо перейти. Внутри нее вы увидите файл manage.py. Этот файл мы будем использовать очень часто, на всем протяжении работы с проектом.


Можно сразу попробовать запустить встроенный в Django веб-сервер с помощью команды: (надеюсь, перед тем как запускать эту команду вы не забыли перейти в папку log/log, там, где вы видите файл manage.py) Если после запуска сервера вы откроете браузер, и перейдёте по адресу localhost:8000, то вы должны увидеть приветственную страницу Django. Если страница у вас открылась, значит все в порядке и можно продолжать.

Для хранения записей на сайте нужна БД, на данный момент у нас уже есть sqlite-БД, которая находится в файле db.sqlite3 (рядом с файлом manage.py). Но пока что она пустая, поэтому теперь создадим таблицы в БД, которые потребуются для работы нашего проекта с помощью команды: Так как проект на Django должен состоять из различных приложений (apps), то теперь нам нужно создать новое приложение в нашем проекте, назовем его logs. Делается это с помощью команды: После чего папка проекта (log/log) будет иметь следующее содержимое: Получается, что у нас целых 3 папки log, одна в другой, как в матрёшке. И есть еще папка с названием logs. Постарайтесь не запутаться в них, потому что в дальнейшем нам придется работать отдельно в каждой из них, и очень важно не перепутать в какой что делать.

Чтобы Django узнал о существовании вновь созданного приложения logs, в файле settings.py (папка log/log/log) найдите список INSTALLED_APPS, и добавьте новый элемент с названием приложения – logs. Должно получиться вот так (добавленная строчка выделена жирным):
Модель (Model)
Добавим модели Topic и Entry в файл models.py (папка log/log/logs). Модели будут содержать описания о том, какие данные будут храниться в БД-таблицах нашего проекта.

Откроем файл models.py и добавим туда следующее содержимое: Таблицы моделей Entry и Topic имеют связь один-ко-многим. То есть у каждой основной записи или темы (Topic) может быть много вложенных (Entry).

После добавления нового пользователя можно попробовать войти в админ-панель Django. Если у вас всё получится, то вы должны увидеть следующую картинку: Здесь вы видите таблицу с 2-мя строчками для работы с группами пользователей (Groups) и с самими пользователями (Users). Для того, чтобы мы здесь могли работать с нашими моделями, их нужно зарегистрировать в файле admin.py (log/log/logs). Откроем файл и добавим в него следующий код: После этого обновите страницу админ-панели и вы должны увидеть 2 новые строчки: Entries и Topics.
Маршруты (urls)
Нам нужно добавить маршруты, по которым запросы от браузера будут открывать нужные страницы сайта. Для этого следует отредактировать 2 файла с одинаковым названием urls.py, это файл urls.py для всего проекта в целом (папка log/log/log) и для отдельного приложения logs (папка log/log/logs). В папке приложения logs файла urls.py нет, его нужно создать самостоятельно.

Для начала откроем файл urls.py проекта (папка log/log/log). И в список urlpatterns добавим новую строчку (выделена жирным): Чтобы не было ошибки нужно в строчку (выше списка urlpatterns): добавить импорт метода include(). После чего эта строчка будет выглядеть следующим образом: Далее создадим файл urls.py в папке приложения (папка log/log/logs). Его содержимое должно быть таким: Здесь, в методе path() первым параметром идет url страницы на сайте, 2-й параметр – это метод в файле views (в данном случае index или topic), который должен обрабатывать пришедший запрос от посетителя сайта, 3-й параметр – это произвольное имя данного маршрута, которое может применяться в дальнейшем для обращения к этому маршруту.

Если интересно, то определение метода path() в документации выглядит следующим образом: path(route, view, kwargs=None, name=None)

Представление (View)
Представление в Django – это контроллер в других фреймворках. Представление получает информацию от модели и отдает её в шаблон (template), который, в свою очередь, нужен для размещения переданной ему информации на html-странице. Класс представления – views.py можно найти в папке приложения logs (log/log/logs). Добавим в него 2 метода из маршрутов, которые мы добавили выше, в файле urls.py приложения (index() и topic()). В результате его содержимое должно быть следующим: В обоих методах мы видим метод render(). Он использует html-файлы для вывода полученных из модели данных на страницу в браузере. Это и есть шаблоны. Всего нам нужно будет их 3 штуки, один общий (base.html), который будут наследовать 2 других. Первый (index.html) – для вывода списка основных записей или тем (topics), второй (topic.html) – для вывода какой-то определенной темы, и списка вложенных в нее заметок/записей (entries).

Шаблон (Template)
Для того чтобы добавить нужные нам шаблоны в папке приложения logs (log/log/logs) создадим папку templates, а внутри нее папку с названием приложения logs. Затем внутри папки logs создадим 3 файла: base.html, index.html и topic.html. Содержимое файлов представляет html-код с включениями Django-директив. Особо выпендриваться с html-разметкой я не стал, чтобы не усложнять материал, но вы, конечно, можете сделать всё по-своему.

Содержимое файла base.html следующее: Вначале выводится ссылка на индексную страницу сайта, обратите внимание, чтобы создать ссылку здесь используется имя маршрута index, которое мы указали ранее в файле urls.py. Между Django-директивами и будет включено содержимое из 2-х других шаблонов (index.html и topic.html).

Язык шаблонов Django разработан как компромисс между мощностью и простотой. Он разработан, чтобы сделать так, чтобы те, кто знаком с кодом HTML, чувствовали себя комфортно. Если вы знакомы с другими языками шаблонов, ориентированными на текст, такими как Smarty или Jinja2 , вы не будете лишним с шаблонами Django.

Если у вас есть опыт программирования или вы привыкли к языкам, которые смешивают программный код непосредственно с HTML-кодом, вам нужно помнить, что система шаблонов Django - это не просто код Python. встроен в HTML-код. Это добровольная концепция: система шаблонов предназначена для выражения представления, а не логики программирования.

Система шаблонов Django предоставляет теги, функции которых аналогичны некоторым программным структурам (тег if для логических тестов, тег for для циклов и т. Д.), Но они выполняются не только как код Python. корреспондент; Система шаблонов Django не выполняет просто какие-либо выражения Python. По умолчанию поддерживаются только теги, фильтры и синтаксис, показанные ниже (хотя при необходимости вы можете добавить свои собственные расширения к языку шаблона).

Шаблоны ¶

Шаблон - это текстовый файл. Он может генерировать любой текстовый формат (HTML, XML, CSV и т. Д.).

Шаблон содержит переменные , которые заменяются значениями при оценке шаблона, а также теги , управляющие логикой шаблона.

Вот минимальный шаблон, иллюстрирующий некоторые основные принципы. Далее в этом документе будет объяснено каждый элемент.

Зачем использовать шаблон на основе текста вместо шаблона на основе XML (например, TAL от Zope)? Мы хотели, чтобы язык шаблонов Django можно было использовать не только для шаблонов XML / HTML. Вы можете использовать язык шаблона для любого текстового формата, такого как электронная почта, JavaScript и CSV.

Переменные ¶

Переменные выглядят следующим образом : . Когда механизм шаблонов встречает переменную, он оценивает ее и заменяет результатом. Имена переменных могут содержать любой буквенно-цифровой символ, а также знак подчеркивания ( ), но не могут начинаться с подчеркивания. Точка ( ) также может быть частью имени переменной, но со специальным значением, как мы объясним ниже. Важно отметить, что в именах переменных нельзя использовать пробелы и знаки препинания . > "_" "."

Точка ( . ) используется для доступа к атрибутам переменной.

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

  • Консультация по словарю
  • Поиск атрибута или метода
  • Консультации по цифровому индексу

Если полученное значение является исполняемым, оно вызывается без параметров. Результат вызова становится значением шаблона.

Такой порядок поиска может привести к неожиданному поведению объектов, которые перегружают поиск по словарю. Например, рассмотрим следующий фрагмент кода, который пытается выполнить цикл по объекту collections.defaultdict :

Так как сначала выполняется поиск в словаре, именно это и происходит здесь, и вместо .items() ожидаемого метода получается значение по умолчанию . В этом случае сначала рассмотрите возможность преобразования объекта в простой словарь.

В приведенном выше примере будет заменен атрибутом объекта . > title section

Если вы вызываете переменную, которая не существует, система шаблонов вставляет значение параметра string_if_invalid , которое '' по умолчанию (пустая строка).

Доступ к переменным атрибутам, начинающимся с подчеркивания, недоступен, поскольку они обычно считаются частными.

Фильтры ¶

Вы можете изменить отображение переменных с помощью фильтров .

Фильтры выглядеть следующим образом : . Здесь отображается значение переменной после того, как оно было отфильтровано фильтром, преобразующим текст в нижний регистр. Используйте вертикальную полосу ( ), чтобы применить фильтр. > > lower |

Фильтры можно связать. Результат одного фильтра применяется к следующему. - это распространенная идиома для экранирования текстового содержимого и последующего преобразования разрывов строк в теги . >

Некоторые фильтры принимают параметры. Настройка фильтра следующим образом: . Это отображает первые 30 слов переменной . > bio

Параметры фильтра, содержащие пробелы, должны быть заключены в кавычки; например, чтобы объединить список с помощью запятой и пробела, вам придется написать . >

Django предоставляет около шестидесяти встроенных шаблонных фильтров. Все они описаны в встроенных фильтрах ссылки . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых шаблонных фильтров:

Если переменная содержит значение false или пусто, этот фильтр использует указанное значение по умолчанию. В противном случае он использует значение переменной. Например :

Если value не указан или пуст, в приведенном выше коде отображается " nothing ".

Возвращает длину значения. Это работает как для текста, так и для списков. Например :

Если value есть , то результат будет . ['a', 'b', 'c', 'd'] 4

Форматирует значение как удобочитаемый размер файла (например , и т. Д.). Например : '13 Kio' '4.1 Mio' '102 octets'

ЕСЛИ value содержит 123456789, результат будет . 117.7 Mio

Это всего лишь несколько примеров; см. полный список в справочнике по встроенным фильтрам .

Вы также можете создавать свои собственные фильтры шаблонов; см. Пользовательские теги и фильтры шаблонов .

Интерфейс администратора Django может включать в себя полный справочник всех фильтров и тегов шаблонов, доступных для данного сайта. См . Генератор документации администрирования Django .

Теги (метки на английском языке) выглядеть следующим образом : . Теги сложнее переменных: одни создают текст, другие управляют потоком, выполняя циклы или логику, а третьи загружают внешнюю информацию в шаблоны, чтобы переменные могли использовать их позже.

Некоторые теги требуют открывающего и закрывающего тегов (например ). . contenu de la balise .

Django предоставляет около 20 встроенных тегов шаблонов. Все они описаны в справочнике по встроенным тегам . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов шаблонов:

Просмотрите каждый элемент в списке. Например, чтобы отобразить список спортсменов, содержащийся в athlete_list :

Оценивает переменную, и если эта переменная равна True , отображается содержимое блока:

Вы также можете использовать в теге фильтры и разные операторы if :

Несмотря на то, что приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают текст, поэтому математические сравнения с использованием фильтров редко работают должным образом. length это исключение.

block и extends Определяет наследование шаблонов (см. Ниже), мощный способ устранения избыточного содержимого на уровне шаблона.

Приведенные выше примеры - это лишь избранные из полного списка; полный список см. в справочнике по встроенным тегам .

Вы также можете создавать свои собственные теги шаблонов; см. Пользовательские теги и фильтры шаблонов .

Интерфейс администратора Django может включать в себя полный справочник всех фильтров и тегов шаблонов, доступных для данного сайта. См . Генератор документации администрирования Django .

Комментарии ¶

Прокомментировать некоторые линии в шаблоне, используйте комментарий синтаксис: .

Например, этот шаблон создает контент 'hello' :

Комментарий может содержать любой код шаблона, действительный или нет. Например :

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

Наследование шаблонов ¶

Давайте рассмотрим наследование шаблонов на примере:

В этом примере тег block определяет три блока, которые могут заполняться дочерними шаблонами. Тег block только сигнализирует механизму шаблонов, что дочерний шаблон может переопределить эти части шаблона.

Дочерний шаблон может выглядеть так:

На данный момент, шаблон двигатель замечает три метки block из base.html и заменяет эти блоки с содержимым шаблона ребенка. В зависимости от значения blog_entries результат может выглядеть так:

Обратите внимание: поскольку дочерний шаблон не определял блок sidebar , используется значение из родительского шаблона. Содержимое родительского тега шаблона всегда используется как содержимое по умолчанию.

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

Такой подход максимизирует повторное использование кода и упрощает добавление элементов в области общего содержимого, например навигацию по отдельным разделам.

Вот несколько советов по наследованию:

Если вы используете в шаблоне, это должен быть первый тег в этом шаблоне. В противном случае наследование шаблона работать не будет.

Не экономьте на тегах в основных шаблонах. Помните, что дочерние шаблоны не должны переопределять все родительские блоки, поэтому вы можете поместить контент общего назначения в некоторые блоки и переопределить только то, что необходимо в дочерних шаблонах. Лучше иметь слишком много точек вставки, чем их кончать.

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

Если вам нужно реплицировать содержимое родительского блока шаблона, переменная сделает свое дело. Это полезно, когда вы хотите дополнить содержимое родительского блока, а не просто перезаписать его. Данные, вставленные с помощью , не экранируются автоматически (см. Следующий раздел ), так как при необходимости они уже были экранированы в родительском шаблоне. > >

Переменные, созданные вне блока с использованием синтаксиса тега шаблона, не могут использоваться внутри блока. Например, этот шаблон вообще ничего не выдаст: as

Для лучшей читаемости вы можете дать своему тегу имя . Например :

В больших шаблонах этот метод позволяет лучше увидеть, какой тег закрывает этот тег.

Наконец, обратите внимание, что вы не можете определить несколько тегов block с одним и тем же именем в одном шаблоне. Это ограничение существует, потому что маяк block работает "в обоих" направлениях. То есть тег block не только определяет пустоту, которую нужно заполнить, он также определяет контент, который заполняет эту пустоту в родительском элементе . Если бы block в шаблоне было два тега с одинаковыми именами, родительский элемент этого шаблона не знал бы, из какого блока следует учитывать содержимое.

Автоматический переход в HTML ¶

При создании HTML с помощью шаблонов всегда существует риск того, что переменная будет включать символы, которые изменяют созданный HTML. Например, рассмотрим этот фрагмент шаблона:

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

При таком значении имени шаблон будет создан следующим образом:

… Это означает, что браузер будет отображать окно предупреждения JavaScript!

Точно так же, что, если имя содержит такой символ ' ?

Это приводит к отображению такого результата шаблона:

… Что сделало бы остальную часть веб-страницы жирной!

Ясно, что не следует слепо доверять данным, отправляемым пользователями, вставляя их непосредственно на свои веб-страницы, поскольку злоумышленник может использовать этот вид недостатка с плохой точки зрения. Этот тип уязвимости безопасности называется атакой с использованием межсайтовых сценариев (XSS).

Чтобы избежать этой проблемы, у вас есть два варианта:

  • Во-первых, вы можете попытаться передать эти небезопасные переменные через фильтр escape (описанный ниже), который преобразует потенциально опасные символы HTML в безвредные. Это решение по умолчанию, которое Django выбрал в первые годы своего существования, но проблема в том, что вам , разработчику или автору шаблона, нужно убедиться, что все ускользнет. Очень быстро забыть экранировать данные.
  • Во-вторых, вы можете воспользоваться автоматическим экранированием HTML, который выполняет Django. В оставшейся части этого раздела описывается, как работает автоматический спуск.

По умолчанию в Django каждый шаблон автоматически экранирует результат каждого тега переменной. Точнее, эти пять символов экранированы:

Мы повторяем здесь, что это поведение активно по умолчанию. Если вы используете систему шаблонов Django, вы защищены.

Как отключить автоматическое экранирование ¶

Если вы не хотите, чтобы данные экранировались автоматически на уровне сайта, шаблона или переменной, вы можете отключить его несколькими способами.

Для отдельных переменных ¶

Чтобы отключить автоматическое экранирование для отдельной переменной, используйте фильтр safe :

safe (Safe на английском языке) может использоваться как сокращение для safe, чтобы не требовать экранирования, или может быть интерпретировано в HTML безопасным способом . В этом примере, если он data содержит '' , отображаемый результат будет следующим:

Для шаблонных блоков ¶

Чтобы управлять автоматическим экранированием в шаблоне, окружите шаблон (или часть шаблона) тегом autoescape , например:

Тег autoescape принимает on или off в качестве параметра. Иногда желательно принудительное автоматическое экранирование в контексте, где оно отключено. Вот пример шаблона:

Тег с автоматическим выходом передает свои эффекты шаблонам, которые расширяют текущий шаблон, а также шаблоны, включенные в тег include , как и все теги блоков. Например :

Поскольку автоматическое экранирование отключено в базовом шаблоне, оно также будет отключено в дочернем шаблоне, в результате чего, например, будет отображаться следующий HTML-контент, когда переменная greeting содержит текст Hello! :

Примечания ¶

Обычно разработчикам шаблонов не нужно беспокоиться об автоматическом экранировании. Разработчики на стороне Python (те, кто пишет представления и настраиваемые фильтры) должны подумать о ситуациях, когда данные не следует экранировать, и пометить данные соответствующим образом, чтобы все работало так, как ожидалось в шаблонах.

Если вы создаете шаблон, который можно использовать в ситуациях, когда вы не уверены, активно ли автоматическое экранирование, добавьте фильтр escape к любой переменной, требующей экранирования. Когда активен автоматический переход, нет риска, что фильтр удвоит данные, потому что он не затрагивает переменные, которые уже прошли автоматический переход. escape

Буквальный текст и автоматическое экранирование ¶

Как упоминалось ранее, параметры фильтра могут быть строками:

Весь буквальный текст вставляется в шаблон без автоматического экранирования, как если бы он систематически проходил через фильтр safe . Логика такого поведения заключается в том, что автор шаблона имеет контроль над содержимым текста, поэтому он может гарантировать, что текст правильно экранирован при написании шаблона.

Это означает, что вам нужно написать:

Это не влияет на данные, поступающие от самой переменной. При необходимости содержимое переменной всегда экранируется автоматически, поскольку оно находится вне контроля автора шаблона.

Доступ к вызовам методов ¶

Точно так же объекты QuerySets предоставляют метод count() для подсчета количества содержащихся в них объектов. Таким образом, вы можете получить количество всех комментариев, относящихся к текущей задаче, с помощью:

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

В этом документе объясняется синтаксис языка системы шаблонов Django. Если вы ищете более технический взгляд на то, как это работает и как его расширить, смотрите Язык шаблонов Django: для программистов на Python .

Язык шаблонов Django разработан для достижения баланса между мощностью и простотой. Он разработан, чтобы чувствовать себя комфортно для тех, кто привык работать с HTML. Если вы знакомы с другими языками текстовых шаблонов, такими как Smarty или Jinja2, вы должны чувствовать себя как дома с шаблонами Django.

Если у вас есть опыт программирования или вы привыкли к языкам, которые смешивают программный код непосредственно с HTML, вы должны иметь в виду, что система шаблонов Django - это не просто Python, встроенный в HTML. Это сделано намеренно: система шаблонов предназначена для выражения представления, а не логики программы.

Система шаблонов Django предоставляет теги, которые работают аналогично некоторым программным конструкциям - тег if для логических тестов, тег for для цикла и т.д., но они не просто выполняются как соответствующий код Python, и система шаблонов не будет выполнять произвольные выражения Python. По умолчанию поддерживаются только теги, фильтры и синтаксис, перечисленные ниже (хотя вы можете добавить свои собственные расширения к языку шаблона по мере необходимости).

Шаблоны¶

Шаблон - это текстовый файл. Он может генерировать любой текстовый формат (HTML, XML, CSV и т.д.).

Шаблон содержит переменные, которые заменяются значениями при оценке шаблона, и теги, которые управляют логикой шаблона.

Ниже приведен минимальный шаблон, иллюстрирующий некоторые основы. Каждый элемент будет объяснен позже в этом документе.

Зачем использовать текстовый шаблон вместо XML (например, TAL от Zope)? Мы хотели, чтобы язык шаблонов Django можно было использовать не только для шаблонов XML/HTML. Вы можете использовать язык шаблона для любого текстового формата, такого как электронная почта, JavaScript и CSV.

Переменные¶

Переменные выглядят так: > . Когда механизм шаблонов встречает переменную, он оценивает эту переменную и заменяет ее результатом. Имена переменных состоят из любой комбинации буквенно-цифровых символов и символа подчеркивания ( "_" ), но не могут начинаться с подчеркивания и не могут быть числом. Точка ( "." ) также появляется в разделах переменных, хотя это имеет особое значение, как указано ниже. Важно отметить, что в именах переменных нельзя использовать пробелы или знаки препинания.

Используйте точку ( . ) Для доступа к атрибутам переменной.

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

  • Поиск в словаре
  • Поиск атрибута или метода
  • Поиск по числовому индексу

Если полученное значение вызывается, оно вызывается без аргументов. Результат вызова становится значением шаблона.

Этот порядок поиска может вызвать непредвиденное поведение с объектами, которые переопределяют поиск по словарю. Например, рассмотрим следующий фрагмент кода, который пытается перебрать файл collections.defaultdict :

Поскольку поиск по словарю выполняется первым, это поведение срабатывает и предоставляет значение по умолчанию вместо использования предполагаемого метода .items() . В этом случае сначала подумайте о преобразовании в словарь.

В приведенном выше примере > будет заменен атрибутом title объекта section .

Если вы используете переменную, которой не существует, система шаблонов вставит значение параметра string_if_invalid , который по умолчанию установлен на '' (пустая строка).

Доступ к переменным атрибутам, начинающимся с подчеркивания, недоступен, поскольку они обычно считаются частными.

Фильтры¶

Вы можете изменять переменные для отображения с помощью фильтров.

Фильтры выглядят так: > . Это отображает значение переменной > после фильтрации с помощью фильтра lower , который преобразует текст в нижний регистр. Используйте вертикальную черту ( | ), чтобы применить фильтр.

Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит так: > . Это отобразит первые 30 слов переменной bio .

Аргументы фильтра, содержащие пробелы, должны быть заключены в кавычки; например, чтобы присоединиться к списку с запятыми и пробелами, вы должны использовать > .

Django предоставляет около шестидесяти встроенных шаблонных фильтров. Вы можете прочитать все о них в справочнике по встроенным фильтрам . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых шаблонных фильтров:

Если переменная ложна или пуста, используйте данное значение по умолчанию. В противном случае используйте значение переменной. Например:

Возвращает длину значения. Это работает как для строк, так и для списков. Например:

Если value равно ['a', 'b', 'c', 'd ] , на выходе будет 4 .

Если value равно 123456789, то на выходе будет 117.7 MB .

Опять же, это всего лишь несколько примеров; смотрите справочник по встроенным фильтрам для получения полного списка.

Вы также можете создавать свои собственные фильтры шаблонов; смотрите How to create custom template tags and filters .

Интерфейс администратора Django может включать в себя полную ссылку на все теги шаблонов и фильтры, доступные для данного сайта. Смотрите Генератор документации для администраторов Django .

Теги выглядят так: . Теги более сложны, чем переменные: некоторые создают текст в выходных данных, некоторые управляют потоком, выполняя циклы или логику, а некоторые загружают внешнюю информацию в шаблон для использования последующими переменными.

Для некоторых тегов требуются начальные и конечные теги (например, . tag contents . ).

Django поставляется с двумя десятками встроенных тегов шаблонов. Вы можете прочитать все о них в справочнике по встроенным тегам . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов:

Перебераеи каждый элемент в массиве. Например, чтобы отобразить список спортсменов, представленный в athlete_list :

Вы также можете использовать фильтры и различные операторы в теге if :

Хотя приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают строки, поэтому математические сравнения с использованием фильтров обычно не работают так, как вы ожидаете. length является исключением.

block и extends Настройте наследование шаблонов (смотрите ниже), мощный способ сократить количество лишних повторений в шаблонах.

Опять же, приведенное выше - это лишь выборка всего списка; смотрите полный список справочник по встроенным тегам .

Вы также можете создавать собственные настраиваемые теги шаблонов; смотрите How to create custom template tags and filters .

Интерфейс администратора Django может включать в себя полную ссылку на все теги шаблонов и фильтры, доступные для данного сайта. Смотрите Генератор документации для администраторов Django .

Коментарі¶

Чтобы закомментировать часть строки в шаблоне, используйте синтаксис комментария: .

Например, этот шаблон будет отображаться как 'hello' :

Комментарий может содержать любой код шаблона, недействительный или нет. Например:

Этот синтаксис можно использовать только для однострочных комментариев (символы новой строки между разделителями не допускаются). Если вам нужно закомментировать многострочную часть шаблона, смотрите тег comment .

Наследование шаблона¶

Давайте посмотрим на наследование шаблонов, начав с примера:

В этом примере тег block определяет три блока, которые могут быть заполнены дочерними шаблонами. Все, что делает тег block , - это сообщает механизму шаблонов, что дочерний шаблон может переопределить эти части шаблона.

Дочерний шаблон может выглядеть так:

В этот момент механизм шаблонов заметит три тега block в base.html и заменит эти блоки содержимым дочернего шаблона. В зависимости от значения blog_entries вывод может выглядеть так:

Обратите внимание, что, поскольку дочерний шаблон не определил блок sidebar , вместо него используется значение из родительского шаблона. Контент внутри тега в родительском шаблоне всегда используется в качестве запасного варианта.

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

  • Создайте шаблон base.html , который будет содержать основной внешний вид вашего сайта.
  • Создайте шаблон base_SECTIONNAME.html для каждого раздела вашего сайта. Например, base_news.html , base_sports.html . Все эти шаблоны расширяют файл base.html и включают стили/дизайн для конкретных разделов.
  • Создавайте индивидуальные шаблоны для каждого типа страницы, например для новостной статьи или записи в блоге. Эти шаблоны расширяют соответствующий шаблон раздела.

Такой подход максимизирует повторное использование кода и помогает добавлять элементы в области общего содержимого, например навигацию по разделу.

Вот несколько советов по работе с наследованием:

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

Если вам нужно получить содержимое блока из родительского шаблона, переменная > поможет. Это полезно, если вы хотите добавить к содержимому родительского блока, а не полностью его переопределить. Данные, вставленные с использованием > , не будут автоматически экранированы (смотрите следующий раздел), поскольку они уже были экранированы, если необходимо, в родительском шаблоне.

Для большей удобочитаемости вы можете дополнительно присвоить имя своему тегу . Например:

В более крупных шаблонах этот метод помогает увидеть, какие теги закрываются.

Автоматическое экранирование HTML¶

При создании HTML из шаблонов всегда существует риск того, что переменная будет включать символы, влияющие на результирующий HTML. Например, рассмотрим этот фрагмент шаблона:

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

С этим значением имени шаблон будет отображаться как:

…это означает, что в браузере появится всплывающее окно с предупреждением JavaScript!

Точно так же, что, если имя содержит символ ' , как это?

В результате получится такой шаблон, как этот:

…which, in turn, would result in the remainder of the web page being bolded!

Clearly, user-submitted data shouldn’t be trusted blindly and inserted directly into your web pages, because a malicious user could use this kind of hole to do potentially bad things. This type of security exploit is called a Cross Site Scripting (XSS) attack.

Чтобы избежать этой проблемы, у вас есть два варианта:

  • Во-первых, вы можете убедиться, что каждая ненадежная переменная пропущена через фильтр escape (описанный ниже), который преобразует потенциально опасные символы HTML в опасные. Это было решение по умолчанию в Django в течение первых нескольких лет, но проблема в том, что оно возлагает бремя на вас, разработчика/автора шаблона, чтобы гарантировать, что вы избегаете всего. Легко забыть экранировать данные.
  • Во-вторых, вы можете воспользоваться автоматическим экранированием HTML в Django. В оставшейся части этого раздела описывается, как работает автоматическое экранирование.

По умолчанию в Django каждый шаблон автоматически экранирует вывод каждого тега переменной. В частности, эти пять символов экранированы:

Опять же, мы подчеркиваем, что это поведение включено по умолчанию. Если вы используете систему шаблонов Django, вы защищены.

Как выключить¶

Если вы не хотите, чтобы данные автоматически экранировались на уровне каждого сайта, шаблона или переменной, вы можете отключить его несколькими способами.

Для отдельных переменных¶

Чтобы отключить автоматическое экранирование для отдельной переменной, используйте фильтр safe :

Думайте о safe как о сокращении от защищено от дальнейшего экранирования или можно безопасно интерпретировать как HTML. В этом примере, если data содержит '' , вывод будет:

Для шаблонных блоков¶

Чтобы управлять автоматическим экранированием для шаблона, оберните шаблон (или определенный раздел шаблона) в тег autoescape , например:

Тег autoescape принимает в качестве аргумента либо on , либо off . Иногда вам может потребоваться принудительное автоматическое экранирование, когда в противном случае оно было бы отключено. Вот пример шаблона:

Тег с автоматическим экранированием передает свой эффект на шаблоны, которые расширяют текущий, а также на шаблоны, включенные с помощью тега include , как и все теги блоков. Например:

Поскольку автоматическое экранирование отключено в базовом шаблоне, оно также будет отключено в дочернем шаблоне, что приведет к отображению следующего HTML-кода, когда переменная приветствия содержит строку Hello! :

Примечания:¶

Как правило, авторам шаблонов не нужно особо беспокоиться об автоматическом экранировании. Разработчики на стороне Python (люди, пишущие представления и настраиваемые фильтры) должны подумать о случаях, в которых данные не следует экранировать, и соответствующим образом пометить данные, чтобы в шаблоне все работало.

Если вы создаете шаблон, который может использоваться в ситуациях, когда вы не уверены, включено ли автоматическое экранирование, добавьте фильтр escape к любой переменной, которая требует экранирования. Когда включено автоматическое экранирование, нет опасности lkz фильтра escape двойного экранирования данных - фильтр escape не влияет на переменные с автоматическим экранированием.

Строковые литералы и автоматическое экранирование¶

Как мы упоминали ранее, аргументами фильтра могут быть строки:

Все строковые литералы вставляются без автоматического экранирования в шаблон - они действуют так, как если бы все они были пропущены через фильтр safe . Причина этого заключается в том, что автор шаблона контролирует то, что входит в строковый литерал, поэтому он может убедиться, что текст правильно экранирован при записи шаблона.

Это означает, что вы должны написать:

Это не влияет на то, что происходит с данными, поступающими от самой переменной. При необходимости содержимое переменной по-прежнему автоматически экранируется, поскольку оно находится вне контроля автора шаблона.

Доступ к вызовам методов¶

Аналогичным образом QuerySets предоставляет метод count() для подсчета количества содержащихся в них объектов. Следовательно, вы можете получить количество всех комментариев, относящихся к текущей задаче, с помощью:

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

В этом задании вы будете оценивать знания Django, которые вы приобрели в Django Web Framework (Python), чтобы создать очень простой блог.

Предпосылки: Перед этим заданием, вы должны были проработать все статьи этого модуля.
Задача: Проверить понимание основ Django, включая конфигурации URL, модели, представления, формы и шаблоны.

Краткое описание проекта

Информация для указанного автора (по id) и список постов:

Сведения о блоге.

Список блогеров в системе:

  • Доступный для всех пользователей с боковой панели сайта
  • Имя блогера связано с блогом автора страницы.

Создать комментарий для публикации в блоге:

Стандартные страницы аутентификации Django для входа, выхода и установки пароля:

Кроме того, вы должны написать некоторые базовые тесты для проверки:

Примечание: Конечно, есть много других тестов, которые вы можете запустить. Используйте на своё усмотрение, но мы ожидаем, что вы сделаете хотя бы тесты выше.

В следующем разделе показаны скриншоты сайта, который выполняет перечисленные выше требования.

Скриншоты

Следующий скриншот - пример того, что должна выводить готовая программа.

  • На боковой панели также списки вошедшего в систему пользователя.
  • Индивидуальные блоги и блогеры доступны в виде ссылок на странице.
  • Разбивка включена (в группах по 5)
  • Показ от новых к старым.

List of all blogs

Список всех блогеров

Это ссылки на всех блогеров в "All bloggers" по ссылке, которая на боковой панели. В этом случае мы можем увидеть на боковой панели, что ни один пользователь не вошёл в систему.

List of all bloggers

Подробная страница блога

Это показывает подробную страницу для конкретного блога.

Blog detail with add comment link

Обратите внимание, что комментарии имеют дату и время, и расположены в порядке от самых старых до новейших (противоположно порядку ведения блога). В конце у нас есть ссылка для доступа к форме, чтобы добавить новый комментарий. Если пользователь не вошёл в систему, мы бы увидели предложение войти в систему.

Comment link when not logged in

Добавить форму комментария

Это форма добавления комментариев. Обратите внимание, что мы вошли в систему. Когда это удастся, мы должны вернуться к связанной странице блога.

Add comment form

Об авторе

Здесь отображается информация о блогере вместе со списком его блогов.

Blogger detail page

Завершающие шаги

В следующих разделах описывается, что вам нужно делать.

Советы и подсказки

Этот проект очень похож на LocalLibrary учебник. Вы сможете настроить скелет, поведение входа пользователя / выхода из системы, поддержку статических файлов, представлений, URL-адресов, форм, базовых шаблонов и конфигурации админ-панели, используя почти все те же подходы.

Некоторые общие рекомендации:

Мы кратко говорили о передаче контекста шаблону в представлении на основе классов в теме Django Tutorial Part 6: Generic list and detail views. Для этого вам нужно переопределить get_context_data() (сначала получить существующий контекст, обновить его любыми дополнительными переменными, которые вы хотите передать шаблону, а затем вернуть обновлённый контекст). Например, фрагмент кода ниже показывает, как вы можете добавить объект blogger в контекст на основе его BlogAuthor id.

Аттестация

Оценка этого задания доступна здесь на Github. Эта оценка в основном основана на том, насколько хорошо ваше приложение соответствует требованиям, перечисленным выше, хотя есть некоторые части оценки, которые проверяют ваш код на использование соответствующих моделей и что вы написали хотя бы некоторый тестовый код. Когда вы закончите, вы можете проверить по нашему готовому примеру который соответствует "высокой оценке проекта".

После того, как вы завершили этот модуль, вы также закончили весь контент MDN для изучения базового веб-сайта на сервере Django! Надеемся, вам понравится этот модуль и вы почувствуете, что у вас есть хорошее понимание основ!

Читайте также: