Создание страницы с формой
Создадим страницу с формой для добавления записей. Создадим обработчик с URL-адресом /create и методом create. Он будет использовать шаблон create.html, включающий header.html и footer.html. Имя блока create достаточно для его подключения в шаблоне.
Файл create.html будет аналогичен index.html, за исключением основной части. В нём:
- Объявим блок create.
- Подключим header.html и footer.html.
- Основная часть будет содержать форму добавления статьи.
<form action="/save_article" method="post">
<div class="form-group">
<label for="title">Название статьи</label>
<input type="text" class="form-control" id="title" name="title">
</div>
<div class="form-group">
<label for="anons">Анонс статьи</label>
<textarea class="form-control" id="anons" name="anons" placeholder="Введите анонс статьи"></textarea><br>
</div>
<div class="form-group">
<label for="fulltext">Полный текст статьи</label>
<textarea class="form-control" id="fulltext" name="fulltext" placeholder="Введите полный текст статьи"></textarea><br>
</div>
<button type="submit" class="btn btn-warning">Добавить</button>
</form>
В header.html добавим ссылку «Создать пост», ведущую на /create.
Протестируем дизайн страницы. Нажатие на «Добавить» переадресует на /save_article. По умолчанию, если Go не обрабатывает этот URL, отображается главная страница. Поэтому создадим обработчик для /save_article.
Обработка формы и добавление данных в базу данных
Создадим метод save_article для обработки данных из формы. Он не будет отображать шаблон. Получим данные из формы с помощью переменных title, anons, fulltext и r.FormValue. Имя поля соответствует атрибуту name в элементах input.
title := r.FormValue("title")
anons := r.FormValue("anons")
fulltext := r.FormValue("fulltext")
Создадим таблицу articles в базе данных:
- id (INT, AUTO_INCREMENT, PRIMARY KEY)
- title (VARCHAR(100), UTF8)
- anons (VARCHAR(255), UTF8)
- fulltext (TEXT, UTF8)
Таблица создаётся с помощью программы управления базами данных (например, phpMyAdmin).
В методе save_article подключимся к базе данных (код подключения опущен, предполагается наличие ранее написанного кода). Добавим запись в таблицу articles:
stmt, err := db.Prepare("INSERT INTO articles (title, anons, fulltext) values (?, ?, ?)")
if err != nil {
// Обработка ошибки
}
_, err = stmt.Exec(title, anons, fulltext)
if err != nil {
// Обработка ошибки
}
http.Redirect(w, r, "/", 301) // Переадресация на главную страницу
Запрос использует подготовленные запросы для безопасного встраивания значений.
Проверка данных и вывод сообщений об ошибках
Добавим проверку на пустые поля:
if title == "" || anons == "" || fulltext == "" {
fmt.Fprintf(w, "Не все данные заполнены")
return
}
При пустых полях выводится сообщение об ошибке.
Вывод статей на главной странице
Создадим структуру Article:
type Article struct {
Id int `json:"id"`
Title string `json:"title"`
Anons string `json:"anons"`
Fulltext string `json:"fulltext"`
}
В методе index (обработчик главной страницы) добавим код для выборки данных из базы данных и передачи их в шаблон:
rows, err := db.Query("SELECT * FROM articles")
// Обработка ошибки
posts := []Article{}
for rows.Next() {
var post Article
err := rows.Scan(&post.Id, &post.Title, &post.Anons, &post.Fulltext)
// Обработка ошибки
posts = append(posts, post)
}
rows.Close()
tmpl.ExecuteTemplate(w, "index", posts)
В index.html добавим цикл для вывода статей:
{{if .}}
{{range .}}
<div class="alert alert-success">
<h2>{{.Title}}</h2>
<p>{{.Anons}}</p>
<a href="/post/{{.Id}}" class="btn btn-primary">Читать далее</a>
</div>
{{end}}
{{else}}
<div class="alert alert-warning">Статей нет</div>
{{end}}
Этот код перебирает массив posts и выводит для каждой статьи заголовок, анонс и ссылку «Читать далее».
В этом уроке реализовано добавление и отображение статей на веб-сайте с использованием Go и базы данных. Функционал включает форму добавления, обработку данных, проверку на пустые поля и вывод статей на главной странице. В следующем уроке создадим страницу для отображения полной информации о статье.