Website Builder Templates — Create Your Brand with Style
Чтобы приступить к созданию сайта, выберите один из шаблонов ниже.
All Website Templates
CompassСмотреть CompassSerendipityСмотреть SerendipitySimpleСмотреть SimpleSkylineСмотреть SkylineMeridianСмотреть MeridianCoastalСмотреть CoastalColumnСмотреть ColumnPiecesСмотреть PiecesFantasy JourneyСмотреть Fantasy JourneyDream SpaceСмотреть Dream SpaceCreative WorkshopСмотреть Creative WorkshopLink UniverseБесплатно
Pro
Looking for Website Builder Assistance?
Our team is always available to clarify and assist at any step along your website building journey.
Чат в Интернете
Напишите на почту
Are you sure you want to close the chat?Chat will be closed and the chat history will be cleared.Sorry, can’t receive informationPlease move your mouse to the dialogChat OnlineЧат в Интернете0Dynadot
- Контакты
- О компании
- Безопасность
- Журнал изменений
- Мероприятия
- Способы оплаты
- Предоплата
- Прейскурант
- Распродажи
- Пригласи друга
- Партнерская программа
- Партнерская программа для аукциона
- Наши любимые продукты
Домены
- Регистрация доменов
- Массовый поиск
- Перенос доменов
- Сервис предложений
- Международные домены
- Покупка и продажа доменов
- Просроченные домены
- Освобождающиеся домены
- Дешевые домены
- Поиск Whois
- API
- Расширенное управление доменами
- Программа для торговых посредников
- Приложение
- Генератор имен для бизнеса
- Новости вторичного рынка
Ресурсы
- Справочные материалы
- Сообщество
- Как подать жалобу
- Права регистранта
- Информация для регистрантов
- Политика в отношении конфиденциальности
- Соглашение об обслуживании
- Карта сайта
- Руководство по инвестициям в домены
- График платежей
Веб-сайты
- Бесплатный конструктор сайтов
- Электронная почта
- SSL
- Linkedln
- Youtube
Домены верхнего уровня
- .
COM
- .NET
- .ORG
- .ОРГ
- .ОНЛАЙН
- .САЙТ
- Еще…
Национальные домены
- .TV
- .ME
- .US
- .DE
- .UK
- .IN
- Еще…
Copyright © 2002-2023 Dynadot Inc. Все права защищены.
Django | Шаблоны
Последнее обновление: 16.08.2022
Шаблоны (templates) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.
Допустим, у нас есть проект metanit, и в нем определено одно приложение — hello:
Настройка функциональности шаблонов в проекте Django производится в файле settings.py. с помощью переменной TEMPLATES. Так, по умолчанию переменная TEMPLATES в файле settings.py имеет следующее определение:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
Данная переменная принимает список конфигураций для каждого движка шаблонов. По умолчанию определена одна конфигурация, которая имеет следующшие параметры
BACKEND: движок шаблонов. По умолчанию применяется встроенный движок django.template.backends.django.DjangoTemplates
DIRS: определяет список каталогов, где движок шаблонов будет искать файлы шаблонов. По умолчанию пустой список
APP_DIRS: указывает, будет ли движок шаблонов искать шаблоны внутри папок приложений в папке templates.
OPTIONS: определяет дополнительный список параметров
Итак, в конфигурации по умолчанию параметр APP_DIRS имеет значение True, а это значит, что движок шаблонов
будет также искать нужные файлы шаблонов в папке приложения в каталоге templates. То есть по умолчанию мы уже имеем настроенную конфигурацию,
готовую к использованию шаблонов. Теперь определим сами шаблоны.
Добавим в папку приложения каталог templates. А в нем определим файл index.html:
Далее в файле index.html определим следующий код:
<!DOCTYPE html> <html> <head> <title>Django на METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <h3>Hello METANIT.COM</h3> </body> </html>
По сути это обычная веб-страница, которая содержит код html. Теперь используем эту страницу для отправки ответа пользователю. И для этого перейдем в приложении hello к файлу views.py, который определяет функции для обработки запроса. Изменим этот файл следующим образом:
from django.shortcuts import render def index(request): return render(request, "index.html")
Из модуля
импортируется функция render. shortcuts
Функция index вызывает функцию render, которой передаются объект запроса request и путь к файлу шаблона в рамках папки templates — «index.html».
В файле urls.py проекта пропишем сопоставление функции index с запросом к корню веб-приложения:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), ]
И запустим проект на выполнение и перейдем к приложению в браузере (если проект запущен, то его надо перезапустить):
Подобным образом можно указать и другие шаблоны. Например, в папку templates добавим еще две страницы: about.html и contact.html
И также в файле views.py определим функции, которые используют данные шаблоны:
from django.shortcuts import render def index(request): return render(request, "index.html") def about(request): return render(request, "about.html") def contact(request): return render(request, "contact.html")
А в файле urls.py свяжем функции с маршрутами:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), path("about/", views.about), path("contact/", views.contact), ]
TemplateResponse
Выше для генерации шаблона применялась функция render(), которая является наиболее распространенным вариантом. Однако также мы можем использовать класс TemplateResponse:
from django.template.response import TemplateResponse def index(request): return TemplateResponse(request, "index.html")
Результат будет тот же самый.
НазадСодержаниеВперед
Создание HTML-шаблонов с помощью Go
Когда вы создаете веб-сайт, вы, как правило, динамически генерируете некоторый окончательный контент. Затем вы захотите ввести эти данные в свои конечные веб-страницы для отображения в браузере.
Вы можете выбрать один из двух подходов: встроить структуру своей страницы в программу или объединить окончательные данные с отдельными файлами шаблонов.
Использование шаблонов обеспечивает разделение задач для облегчения сопровождения кодовой базы. Это также упрощает разделение внешних и внутренних задач, распределяя их между разными членами команды. Go имеет отличную поддержку шаблонов в своей стандартной библиотеке.
Начало работы с шаблонами в Go
В стандартной библиотеке Go есть два пакета шаблонов: text/template и html/template . Пакет text/template имеет функциональные возможности для разбора текстовых файлов, тогда как html/template обрабатывает HTML. Используя html/шаблон, вы защищены от атак межсайтового скриптинга (XSS), поскольку Go избегает ввода данных во время рендеринга. Это еще одно преимущество шаблонов перед ручным подходом.
Поскольку пакет шаблона является частью стандартной библиотеки, вам не нужно устанавливать какие-либо зависимости; просто импортируйте его:
import "html/template"
Начните с создания файла HTML, который будет использоваться в качестве шаблона для вашего приложения. Вы можете использовать стандартное расширение .html или .gohtml или .tmpl , оба из которых также распространены. Какое бы расширение вы ни использовали, функциональность вашего приложения будет одинаковой. Некоторые текстовые редакторы могут применять различную подсветку синтаксиса в зависимости от расширений ваших шаблонов. Вот базовый скелет:
Документ
< /html>
Сохраните этот файл в каталоге вашей программы Go. Теперь вы можете начать работать с ним как с шаблоном в вашей программе.
Создайте глобальный экземпляр метода Template пакета шаблона. Вы получите доступ к этому экземпляру шаблона из различных частей вашей программы.
var tmplt *template.Template
Вам нужно будет создать простой сервер для рендеринга и отображения ваших шаблонов. Вот как запустить простой сервер в Go с помощью пакета net/http : , nil)
if err != nil {
log.Fatalln(«Произошла ошибка на сервере:», err)
}
}
Вы позвоните в runServer из вашей основной функции для запуска сервера. У сервера есть только один маршрут, маршрут /home , который будет отображать вашу страницу. Параметр handlePage — это имя функции-обработчика, которая будет отображать вашу страницу. Метод ListenAndServe запускает сервер, прослушивающий порт 8080 на локальном хосте, то есть на вашем собственном компьютере.
Передача переменных в шаблоны
Создать глобальную структуру с именем Новости :
type News struct {
Строка заголовка
Строка текста
}
Вы будете использовать эту структуру для хранения данных и передачи их в шаблон для отображения на последней странице. Затем в своем шаблоне вы можете использовать этот синтаксис для ввода данных:
{{ name }}
Где name — это имя переменной, которую вы передали в свой шаблон. Когда вы визуализируете шаблон, он заменяет значения в фигурных скобках соответствующими данными из вашего кода Go. Поскольку в следующем примере будет передана структура, вы будете использовать точечную нотацию для доступа к ее полям:
{{ .Headline }}
{{ .Body }}
Замените пустой элемент body в скелете вашего шаблона разметка с кодом выше.
Функция обработчика handlePage проверяет, является ли запрос страницы запросом GET. Затем он заполняет структуру образцом данных перед рендерингом шаблона и обслуживанием конечной страницы:
func handlePage(writer http.ResponseWriter, request *http.Request) {
if request.Method == "GET" {
tmplt, _ = template.ParseFiles("tutorial.html")
event := News{
Заголовок: «У makeuseof.com есть все Tech",
Тело: "Посетить MUO для любых технологий",
}
err := tmplt.Execute(write, event)
if err != nil {
return 9 0019 }
}
}
Метод ParseFiles анализирует файл HTML вы указываете. событие переменная является инициализированной структурой. Метод Execute вставит предоставленные данные на последнюю страницу в соответствии с заполнителями в шаблоне. Execute принимает ResponseWriter и данные, в данном случае структуру.
Вот результат запуска сервера и посещения страницы:
Использование управляющих структур в шаблонах
Вы также можете использовать управляющие структуры, такие как условные операторы и циклы, в своих шаблонах.
Цикл позволяет выводить несколько значений и повторно использовать одну и ту же структуру для каждого из них. Используйте ключевое слово диапазона для определения начала повторяющегося содержимого и ключевое слово end для конца. Внутри цикла вы можете использовать синтаксис {{.}} для ввода текущего значения:
{{range .}}
- {{.}}
{{end }}
Затем вы передадите имя структуры данных, которую хотите перебрать, в качестве параметра методу Execute:
makeUseOfCategories := []string{"Объяснение технологии", "Программирование", "Linux",
"Android", "iOS", "Многое другое............ "}
err := tmplt.Execute(write, makeUseOfCategories)
if err != nil {
return
}
makeUseOfCateg Переменная ories — это фрагмент строк, который передается в качестве параметра данных. Вот результат прохода по срезу:
Вы можете использовать условный оператор в своих шаблонах для проверки значения логической переменной. Создайте структуру с логическими полями, например:
type TrueFalser struct {
IsTrue bool
IsFalse bool
IsDefault bool
}
Чтобы использовать условие, включите ключевое слово if в double фигурные скобки перед именем проверяемой переменной. Завершите условный блок ключевым словом end в фигурных скобках:
{{if .IsTrue}}
Вычисляет true и выводит
{{end}}
{{if .IsDefault}}
Вычисляет false и не выводит
{{end}}
{{if .IsFalse}}
Вычисляет false и не выводит
{{end}}
Инициализация структуры в Go устанавливает значения false по умолчанию , поэтому, если вы не инициализируете поле, оно оценивается как false. При инициализации структуры и передаче переменной в качестве данных в шаблон только те поля, которые оцениваются как истинные, приводят к появлению выходных данных.
selection := TrueFalser {
IsTrue: true,
IsFalse: false,
}
err := tmplt.Execute(writer, selection)
Окончательный вывод включает только один абзац, так как только поле isTrue принимает значение true:
Вам не нужно использовать шаблоны для внутренних приложений
Использование шаблонов не является требованием для ваших приложений Go. Вы можете использовать другие подходы, такие как встраивание структуры вашей страницы в вашу программу, наряду с ее логикой и другим поведением.
Тем не менее, вы в конечном итоге будете делать больше работы для себя. Шаблоны Go помогают предотвратить XSS-атаки и упрощают отделение работы над структурой страницы от внутренней логики.
HTML-шаблоны и наследование — поехали (пример)
Глава 2.7.
Давайте вдохнем немного жизни в проект и разработаем правильную домашнюю страницу для нашего веб-приложения Snippetbox. В следующих нескольких главах мы будем работать над созданием страницы, которая будет выглядеть так:
Давайте начнем с создания файла шаблона по адресу ui/html/pages/home.
, который содержит HTML-контент для нашей домашней страницы. Вот так: tmpl
$ cd $HOME/code/snippetbox $ mkdir ui/html/страницы $ touch ui/html/pages/home.tmplФайл: ui/html/pages/home.tmpl
<голова> <мета-кодировка='utf-8'>Главная — Фрагмент <тело> <заголовок> Фрагмент <основной>Последние фрагменты
Здесь пока не на что смотреть!
Примечание: Расширение .tmpl
не несет здесь никакого специального значения или поведения. Я выбрал это расширение только потому, что это хороший способ показать, что файл содержит шаблон Go, когда вы просматриваете список файлов. Но, если вы хотите, вы можете вместо этого использовать расширение .
(что может заставить ваш текстовый редактор распознать файл как HTML для подсветки синтаксиса или автозаполнения) — или вы даже можете использовать «двойное расширение», например .tmpl.html
. Выбор за вами, но в этой книге мы будем использовать .tmpl
для наших шаблонов.
Теперь, когда мы создали файл шаблона, содержащий HTML-разметку для домашней страницы, возникает следующий вопрос: как нам заставить наш обработчик home
отображать его?
Для этого нам нужно использовать пакет Go html/template
, который предоставляет набор функций для безопасного анализа и рендеринга HTML-шаблонов. Мы можем использовать функции этого пакета до
Я продемонстрирую. Откройте файл cmd/web/handlers.go
и добавьте следующий код:
основной пакет Импортировать ( "ФМТ" "html/шаблон" // Новый импорт "журнал" // Новый импорт "сеть/http" "стрконв" ) func home(w http.ResponseWriter, r *http.Request) { если r.URL.Path != "/" { http.NotFound(ш, г) возвращаться } // Используйте функцию template.ParseFiles() для чтения файла шаблона в // набор шаблонов. Если есть ошибка, мы регистрируем подробное сообщение об ошибке и используем // функция http.Error() для отправки общей ошибки 500 Internal Server Error // ответ пользователю. тс, ошибка: = template.ParseFiles("./ui/html/pages/home.tmpl") если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) возвращаться } // Затем мы используем метод Execute() для набора шаблонов, чтобы записать // содержимое шаблона в качестве тела ответа. Последний параметр Execute() // представляет любые динамические данные, которые мы хотим передать, которые сейчас мы // оставить как ноль. ошибка = ts.Execute(w, ноль) если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) } } .
..
Важно отметить, что путь к файлу, который вы передаете функции template.ParseFiles()
, должен быть либо относительным к вашему текущему рабочему каталогу, либо абсолютным путем. В приведенном выше коде я сделал путь относительно корня каталога проекта.
Итак, с учетом сказанного, убедитесь, что вы находитесь в корне каталога вашего проекта, и перезапустите приложение:
$ cd $HOME/code/snippetbox $ беги ./cmd/web 2022/01/29 12:06:02 Запуск сервера: 4000
http://localhost:4000
в веб-браузере. Вы должны обнаружить, что домашняя страница HTML выглядит хорошо.Состав шаблона
По мере того, как мы добавляем больше страниц в это веб-приложение, будет появляться некоторая общая шаблонная HTML-разметка, которую мы хотим включить на каждую страницу — например, заголовок, навигация и метаданные внутри HTML-элемента
.
Чтобы избавить нас от необходимости печатать и предотвратить дублирование, рекомендуется создать base (или master ), который содержит этот общий контент, из которого мы можем затем составить разметку для отдельных страниц.
Создайте новый файл ui/html/base.tmpl
…
$ сенсорный пользовательский интерфейс/html/base.tmpl
И добавьте следующую разметку (которую мы хотим видеть на каждой странице):
Файл: ui/html/base.tmpl{{определить "базу"}} <голова> <мета-кодировка='utf-8'>{{template "title" .}} – Фрагмент <тело> <заголовок> Фрагмент <основной> {{шаблон "основной" .}} {{конец}}
Надеюсь, это покажется вам знакомым, если вы уже использовали шаблоны на других языках. По сути, это обычный HTML с некоторыми дополнительными действиями в двойных фигурных скобках.
Здесь мы используем действие {{define "base"}}...{{end}}
для определения отдельного именованного шаблона с именем base
, который содержит содержимое, которое мы хотим отображать на каждой странице. .
Внутри этого мы используем {{template "title" .}}
и {{template "main" .}}
действий для обозначения того, что мы хотим вызывать другие именованные шаблоны (называемые title
и main
) в определенной точке HTML.
Примечание: Если вам интересно, точка в конце действия {{template "title" .}}
представляет любые динамические данные, которые вы хотите передать вызываемому шаблону. Мы поговорим об этом позже в книге.
Теперь вернемся к файлу ui/html/pages/home.tmpl
и обновим его, чтобы определить title
и main
именованные шаблоны, содержащие определенный контент для домашней страницы.
{{define "title"}}Главная{{end}} {{определить "основной"}}Последние фрагменты
Здесь пока не на что смотреть!
{{конец}}
Как только это будет сделано, следующим шагом будет обновление кода в вашем домашнем обработчике
, чтобы он анализировал оба файла шаблона , например:
![](/800/600/https/schtirlitz.ru/800/600/https/opt-739524.ssl.1c-bitrix-cdn.ru/upload/medialibrary/c79/c795bf8f58d645cfc5806105610366b9.png?1576309300158271)
основной пакет ... func home(w http.ResponseWriter, r *http.Request) { если r.URL.Path != "/" { http.NotFound(ш, г) возвращаться } // Инициализируем слайс, содержащий пути к двум файлам. Это важно // отметить, что файл, содержащий наш базовый шаблон, должен быть *первым* // файл в срезе. файлы: = [] строка { "./ui/html/base.tmpl", "./ui/html/pages/home.tmpl", } // Используйте функцию template.ParseFiles() для чтения файлов и сохранения // шаблоны в наборе шаблонов. Обратите внимание, что мы можем передать фрагмент файла // пути как переменный параметр? тс, ошибка := template.ParseFiles(файлы...) если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) возвращаться } // Используйте метод ExecuteTemplate() для записи содержимого "базы" // шаблон в качестве тела ответа. ошибка = ts.ExecuteTemplate(w, "база", ноль) если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) } } ...
Итак, теперь, вместо непосредственного содержания HTML, наш набор шаблонов содержит 3 именованных шаблона — base
, title
и main
. Мы используем метод ExecuteTemplate()
, чтобы сообщить Go, что мы специально хотим ответить, используя содержимое шаблона base
(который, в свою очередь, вызывает наши шаблоны title
и main
).
Не стесняйтесь перезапустить сервер и попробуйте. Вы должны обнаружить, что он отображает тот же результат, что и раньше (хотя в исходном HTML-коде, где находятся действия, будут лишние пробелы).
Закладные детали
Для некоторых приложений может потребоваться разбить определенные фрагменты HTML на частичные части, которые можно повторно использовать на разных страницах или макетах. Для иллюстрации давайте создадим партиал, содержащий основную панель навигации для нашего веб-приложения.
Создайте новый файл ui/html/partials/nav.tmpl
, содержащий именованный шаблон с именем "nav"
, например:
$ mkdir ui/html/partials $ touch ui/html/partials/nav.tmplФайл: ui/html/partials/nav.tmpl
{{define "nav"}} <навигация> Главная {{конец}}
Затем обновите базовый шаблон
, чтобы он вызывал частичную навигацию с помощью действия {{template "nav" .}}
:
{{определить "базу"}} <голова> <мета-кодировка='utf-8'>{{template "title" .}} – Фрагмент <тело> <заголовок> Фрагмент {{шаблон "навигация" .}} <основной> {{шаблон "основной" .}} {{конец}}
Наконец, нам нужно обновить обработчик home
, чтобы включить новый файл ui/html/partials/nav.
при анализе файлов шаблона: tmpl
основной пакет ... func home(w http.ResponseWriter, r *http.Request) { если r.URL.Path != "/" { http.NotFound(ш, г) возвращаться } // Включить партиал навигации в файлы шаблона. файлы: = [] строка { "./ui/html/base.tmpl", "./ui/html/partials/nav.tmpl", "./ui/html/pages/home.tmpl", } тс, ошибка := template.ParseFiles(файлы...) если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) возвращаться } ошибка = ts.ExecuteTemplate(w, "база", ноль) если ошибка != ноль { log.Print(ошибка.Ошибка()) http.Error(w, "Внутренняя ошибка сервера", 500) } } ...
После перезапуска сервера шаблон base
теперь должен вызывать шаблон nav
, и ваша домашняя страница должна выглядеть так:
Дополнительная информация
Блок действий
В приведенном выше коде мы использовали действие {{template}}
для вызова одного шаблона из другого. Но Go также предоставляет действие
{{block}}...{{end}}
, которое вы можете использовать вместо него. Это действие похоже на действие {{template}}
, за исключением того, что оно позволяет вам указать некоторый контент по умолчанию, если шаблон вызывается не существует в текущем наборе шаблонов .
В контексте веб-приложения это полезно, когда вы хотите предоставить некоторый контент по умолчанию (например, боковую панель), который отдельные страницы могут переопределять в каждом конкретном случае, если это необходимо.
Синтаксически вы используете это так:
{{определить "базу"}}Пример шаблона
{{блокировать "боковую панель" .}}Контент боковой панели по умолчанию
{{конец}} {{конец}}
Но — хочешь — не хочешь требуется для включения любого содержимого по умолчанию между действиями {{block}}
и {{end}}
. В этом случае вызванный шаблон действует как «необязательный».