Ein POST-Formular
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 2 von 20.
Die Seite /events/new/ und ihre View sind bereit, aber auf der Seite gibt es kein Formular, um ein Event hinzuzufügen. Ein Formular, das Daten ändert, verwendet method="post": Der Browser sendet die Felder im Body der Anfrage und nicht in der URL. Die View liest sie aus request.POST aus, wobei jeder Eintrag über das name des jeweiligen Eingabefelds abgefragt wird.
Django schützt außerdem jedes POST-Formular. Eine andere Website könnte ein Formular verbergen, das Daten an deine Website sendet, und der Browser des Besuchers würde es zusammen mit dessen Cookies senden. Dieser Angriff wird als Cross-Site-Request-Forgery bezeichnet, kurz CSRF. Deshalb weist Django jedes POST ohne ein geheimes Token von deiner eigenen Seite mit 403 Forbidden zurück. {% csrf_token %} innerhalb des Formulars fügt dieses Token ein. Ein Newsletter-Formular:
<form method="post">
{% csrf_token %}
<label for="email">Email</label>
<input id="email" name="email" type="email">
<button type="submit">Subscribe</button>
</form>Ein <label> bezeichnet das Eingabefeld, dessen id mit seinem for übereinstimmt, und type="date" zeigt einen Kalender an.
Aufgabe
EinfachErsetze in events/templates/events/new_event.html {# Write the form here #} durch ein Formular.
- Verwende
method="post"und setze{% csrf_token %}an den Anfang. Ohne dieses Token weist Django das Formular mit dem Statuscode 403 zurück. - Füge beschriftete Eingabefelder für
title,date(mittype="date") undplacesowie einen Absende-Button hinzu.
Füge eine Veranstaltung hinzu und klicke dann auf „Alle Veranstaltungen“: Sie erscheint in der Liste.
Probier es selbst
{% extends "events/base.html" %}
{% block title %}Add an event{% endblock %}
{% block content %}
<h1>Add an event</h1>
{# Schreibe das Formular hier #}
{% endblock %}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Formulare
Übe selbstständig: Django-Playground