Rendu dans les templates
Formulaire complet
<form method="post">
{% form.inscription_form %}
<button type="submit">S'inscrire</button>
</form>
Rend automatiquement : tous les champs, les labels, les erreurs de validation, le token CSRF et les scripts JS.
Champ par champ
<form method="post">
<div class="row">
<div class="col-6">{% form.inscription_form.username %}</div>
<div class="col-6">{% form.inscription_form.email %}</div>
</div>
{% form.inscription_form.password %}
<button type="submit">S'inscrire</button>
</form>
Le premier champ déclaré du formulaire emporte avec lui les champs cachés (jeton CSRF et nom du formulaire), où qu'il soit placé dans le template. Rendez-les tous, ou au moins ce premier champ : sans lui, l'envoi est refusé (CSRF) ou ignoré (nom absent).
Erreurs globales
{% if inscription_form.form_errors %}
<div class="alert alert-danger">
{% for msg in inscription_form.form_errors %}
<p>{{ msg }}</p>
{% endfor %}
</div>
{% endif %}
form_errors→Vec<String>— erreurs non liées à un champ (ex: "Identifiants invalides").errors→ map{ field_name: message }— erreurs par champ + erreurs globales sous la cléglobal.
Données de champ en JSON
Les formulaires sérialisent automatiquement errors, form_errors, html, rendered_fields, fields, js_files, rendered_js (le bloc <script> déjà rendu, avec le nonce CSP) et honeypot_html (le champ piège de l'anti-bot, vide sans lui).