Aller au contenu principal

Ajouter un formulaire de contact à un site Hugo (sans backend)

Par Maxime Branger · Publié le

Pourquoi c'est compliqué avec Hugo

Hugo génère des fichiers statiques. Il n'y a rien côté serveur pour traiter une soumission. On va donc créer un shortcode qui envoie les données à AirMess, et vous pourrez l'insérer dans n'importe quelle page.

Étape 1 : déclarer l'URL dans la configuration

Dans hugo.toml :

[params.airmess]
  formUrl = "https://airmess.fr/api/submit/VOTRE_TOKEN"

Garder l'URL dans la configuration permet de la changer sans toucher aux templates.

Étape 2 : créer le shortcode

Créez layouts/shortcodes/contact.html :

<form id="contact-form" action="{{ site.Params.airmess.formUrl }}" method="POST">
  <label for="name">Nom</label>
  <input id="name" name="name" type="text" required>

  <label for="email">Email</label>
  <input id="email" name="email" type="email" required>

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>

  <button type="submit">Envoyer</button>
  <p id="contact-status" role="status"></p>
</form>

<script>
  const form = document.querySelector('#contact-form');
  const status = document.querySelector('#contact-status');

  form.addEventListener('submit', async (e) => {
    e.preventDefault();
    const button = form.querySelector('button');
    button.disabled = true;
    status.textContent = 'Envoi en cours…';

    try {
      const res = await fetch(form.action, {
        method: 'POST',
        body: new FormData(form),
      });
      if (!res.ok) throw new Error(String(res.status));
      form.reset();
      status.textContent = 'Merci, votre message a bien été envoyé.';
    } catch {
      status.textContent = "L'envoi a échoué. Réessayez dans un instant.";
    } finally {
      button.disabled = false;
    }
  });
</script>

Étape 3 : l'utiliser dans une page

Dans content/contact.md :

---
title: "Contact"
---

Une question ? Écrivez-moi.

{{< contact >}}

Remarques

Si votre thème bloque les scripts inline via une Content Security Policy, déplacez le script dans static/js/contact.js et chargez-le avec une balise <script src> . Pour les tests avec hugo server , vérifiez que votre origine locale est autorisée.

Le code complet de ce tutoriel est disponible sur GitHub.