Golang: Добавление данных на сайт через форму

Создание страницы с формой

Создадим страницу с формой для добавления записей. Создадим обработчик с 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 и базы данных. Функционал включает форму добавления, обработку данных, проверку на пустые поля и вывод статей на главной странице. В следующем уроке создадим страницу для отображения полной информации о статье.

Что будем искать? Например,программа