Django Formen
HTML-Formulare sind die klassische Art und Weise interaktive Website. In diesem Kapitel wird erläutert, wie mit Django Formulardaten von einem Benutzer eingereicht befassen.
HTTP-Anforderung
HTTP-Protokoll "Request - Antwort" Art und Weise. Wenn der Client eine Anfrage sendet, können Sie zusätzliche Daten anfordern. Server-Auflösungs-Anforderung können Sie Daten aus dem Client zu bekommen, und bestimmte Dienste auf URL basieren.
GET-Methode
Wir haben eine search.py Datei vor dem Projekt, für eine Benutzeranforderung empfangen:
# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render_to_response # 表单 def search_form(request): return render_to_response('search_form') # 接收请求数据 def search(request): request.encoding='utf-8' if 'q' in request.GET: message = '你搜索的内容为: ' + request.GET['q'].encode('utf-8') else: message = '你提交了空表单' return HttpResponse(message)
In search_form Formularvorlage in der Vorlagenverzeichnis:
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>
urls.py Regel wird wie folgt geändert:
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), )
Zugang Adresse: http: //192.168.45.3: 8000 / search-Form / und Suche, die Ergebnisse sind wie folgt:
POST-Methode
Oberhalb verwendeten wir die Methode GET. View-Anzeige und Anfrage-Verarbeitungsfunktionen in zwei Behandlungs.
Häufiger POST-Methode Daten zu übermitteln. Wir verwenden die folgenden dieser Methode mit einer URL und Handler, zeigt auch die Ansicht und verarbeiten die Anforderung.
Wir haben post in tmplate:
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search-post/" method="post"> {% csrf_token %} <input type="text" name="q"> <input type="submit" value="Submit"> </form> <p>{{ rlt }}</p> </body> </html>
Am Ende der Schablone, haben wir eine rlt Marke Platzhalter für die Tabelle, die Ergebnisse.
Es gibt auch eine Tabelle {% csrf_token%} Tag später. csrf steht für Cross-Site Request Forgery. Dies wird zur Verfügung gestellt von Django verhindern Fälschung Anfragen einreichen. POST-Methode das Formular zu senden, müssen Sie dieses Label.
New search2.py Datei im Verzeichnis Helloworld und search_post Funktion verwenden, um POST-Anfragen bearbeiten:
# -*- coding: utf-8 -*- from django.shortcuts import render from django.core.context_processors import csrf # 接收POST请求数据 def search_post(request): ctx ={} ctx.update(csrf(request)) if request.POST: ctx['rlt'] = request.POST['q'] return render(request, "post", ctx)
urls.py Regel wird wie folgt geändert:
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search from HelloWorld import search2 urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), (r'^search-post/$', search2.search_post), )
Zugang http://192.168.45.3:8000/search-post/ Anzeige ergibt sich wie folgt:
Nach der Beendigung der obigen Beispiele unsere Verzeichnisstruktur:
HelloWorld |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- models.pyc | |-- search.py | |-- search.pyc | |-- search2.py | |-- search2.pyc | |-- settings.py | |-- settings.pyc | |-- testdb.py | |-- testdb.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- TestModel | |-- __init__.py | |-- __init__.pyc | |-- admin.py | |-- models.py | |-- models.pyc | |-- tests.py | `-- views.py |-- manage.py `-- templates |-- base |-- hello |-- post `-- search_form 3 directories, 29 files
Request-Objekt
Jede Ansicht Funktion das erste Argument ist ein Httprequest-Objekt, direkt unterhalb des hallo () Funktion:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
Httprequest-Objekt enthält einige Informationen über die aktuelle Anforderung URL:
Immobilien | Beschreibung |
Weg | Der vollständige Pfad zu der gewünschten Seite, ohne den Domain-Namen - zum Beispiel "/ hallo /". |
Verfahren | String HTTP-Methode in der Anforderung Darstellung verwendet. Es stellt alle Großbuchstaben geschrieben. Zum Beispiel: wenn request.method == 'GET': |
GET | Es enthält alle HTTP-GET-Dictionary-ähnliches Objekt-Parameter. Siehe QueryDict Dokumentation. |
POST | Es enthält alle HTTP POST Parameter Dictionary-ähnliches Objekt. Siehe QueryDict Dokumentation. Situation POST-Request-Server leer erhält, ist ebenfalls möglich. Mit anderen Worten, die Form Formular eine Anfrage per HTTP-POST-Methode einreichen, kann aber keine Daten bilden. Daher kann die Anweisung nicht verwendet werden, wenn request.POST, um zu bestimmen, ob die HTTP-POST-Methode zu verwenden, sollten Sie verwenden, wenn request.method == "POST" (diese Tabelle Methode Attribut sehen). Hinweis: POST nicht Datei-Upload-Informationen enthalten. Siehe FILES Eigenschaften. |
REQUEST | Der Einfachheit halber ist diese Eigenschaft eine Sammlung von POST und GET-Attribut, aber Besonderheit gibt, die Überprüfung POST erste Eigenschaft, dann schauen Attribut GET. Referenz PHP $ _REQUEST. Zum Beispiel, wenn Sie = GET { "name": "John"} und POST = { "Alter": "34"}, Anfrage dann [ "name"] Wert "John", [ "Alter"] der Wert von REQUEST ist "34." Es wird dringend empfohlen, GET und POST zu empfehlen, da diese beiden Attribute eines deutlicher zu verstehen, den Code leichter geschrieben. |
COOKIES | Alle Cookies enthalten Standard-Python-Dictionary-Objekt. Schlüssel und Werte sind Strings. Siehe Kapitel 12, gibt es eine genauere Erklärung über Cookies. |
FILES | Wörterbuch-ähnliches Objekt alle hochgeladenen Dateien enthält. . Jede Taste ist <input type = "file" name = "" /> Dateien Tag-Attributwert name Dateien bei jedem Wert ist auch ein Standard-Python-Dictionary-Objekt, das die folgenden drei Tasten enthält:
Hinweis: Nur die Anforderungsmethode POST und die Anforderung Seite <form> enctype = "multipart / form-data" Attributdateien nur über Daten verfügt. Ansonsten ist FILES ein leeres Wörterbuch. |
META | Mit allen verfügbaren HTTP-Header-Wörterbuch. Zum Beispiel:
META diese Header voran HTTP_ meisten Key, zum Beispiel:
|
Benutzer | Django.contrib.auth.models.User ist ein Objekt, das den derzeit angemeldeten Benutzer darstellt. Wenn Sie der Benutzer Zugriff ist im Moment nicht angemeldet, wird der Benutzer Instanz von django.contrib.auth.models.AnonymousUser initialisiert werden. Sie können durch den Benutzer das is_authenticated () -Methode eines Benutzers identifiziert werden protokolliert: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. Django nur aktiviert, wenn die AuthenticationMiddleware Die Eigenschaft verfügbar ist |
Sitzung | Die einzige beschreibbare Eigenschaft, die die aktuelle Sitzung des Wörterbuch-Objekt darstellt. Django nur aktiviert, wenn die Sitzung unterstützt die Eigenschaft zur Verfügung steht. Siehe Kapitel 12. |
raw_post_data | Raw HTTP POST-Daten, nicht analysiert. Nützlich sein, wenn die Behandlung fortgeschritten. |
Request-Objekt hat auch einige nützliche Methoden:
Weg | Beschreibung |
---|---|
__getitem __ (key) | Gibt die GET / POST-Tasten nehmen Sie die erste POST, nach GET nehmen. Wenn der Schlüssel nicht existiert Wurf KeyError. Dies ist, was wir Wörterbuch Syntax verwenden können Httprequest-Objekt zuzugreifen. Zum Beispiel verlangen [ "foo"] auf die erste request.POST entspricht [ "foo"] dann request.GET [ "foo"] Betrieb. |
has_key () | Überprüfen Sie request.GET oder request.POST Parameter gibt an, ob der Schlüssel aufzunehmen. |
get_full_path () | Rückweg Anforderung enthält eine Abfrage-String. Zum Beispiel: "/ Musik / Bands / the_beatles /? Print = true" |
is_secure () | Wenn die Anforderung sicher ist, wird TRUE zurückgegeben, das heißt, das ausgestrahlte Licht HTTPS-Anforderungen ist. |
QueryDict Objekte
In Httprequest-Objekt, GET und POST-Attribute sind Instanzen django.http.QueryDict Klasse.
QueryDict ähnliche Benutzerwörterbuch-Klasse den Fall von Mehrwert zu handhaben zu einer Einfachbindung entspricht.
QueryDict alle Standard-Wörterbuch Methoden implementieren. Das Verfahren umfasst auch spezifische:
Weg | Beschreibung |
---|---|
__getitem__ | Standard-Wörterbuch Prozess ist ein wenig anders, das heißt, wenn die entsprechende Anzahl von Schlüsselwert, __ getitem __ () liefert den letzten Wert. |
__setitem__ | Parameter Einstellung gibt den Wert einer Liste von Schlüssel (eine Python-Liste). Hinweis: Es kann nur aufgerufen werden (Kopie ist durch die Kopie () erzeugt ein QueryDict Objekt) auf einem wandelbaren QueryDict Objekt. |
get () | Wenn der Schlüssel zu der Vielzahl von entsprechenden Wert, get () liefert den letzten Wert. |
update () | Die Parameter können QueryDict sein, es kann ein Standard-Wörterbuch sein. Verschiedene Standard-Wörterbuch Update-Methode und das Verfahren die Wörterbuchelemente hinzuzufügen, anstatt sie zu ersetzen: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2'] |
Artikel () | Es gibt die Standard-Wörterbuchelemente () Methode ist ein wenig anders, das Verfahren verwendet einen einzelnen Wert Logik __getitem __ (): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
Werte () | Die Standard-Wörterbuch Werte () Methode ist ein wenig anders, das Verfahren verwendet einen einzelnen Wert Logik __getitem __ (): |
Darüber hinaus QueryDict gibt es einige Methoden, die folgende Tabelle:
Weg | Beschreibung |
---|---|
copy () | Gibt eine Kopie des Objekts, die interne Implementierung in Python-Standardbibliothek copy.deepcopy (). Diese Kopie ist wandelbar (änderbar) - das heißt, Sie können den Wert der Kopie ändern. |
getlist (key) | Alle Parameter und Rückgabewerte der entsprechenden Taste, wie eine Python-Liste zurückgegeben. Wenn der Schlüssel nicht vorhanden ist, gibt es eine leere Liste. Es ist garantiert eine Liste von einer Art zurückzukehren de |
Setlist (Schlüssel, list_) | Stellen Sie den Schlüssel Wert list_ (im Gegensatz zu __setitem __ ()). |
appendlist (Schlüssel, item) | Fügen Sie das Element auf den Schlüssel und die damit verbundene interne Liste. |
setlistdefault (key, list) | Und setdefault ein wenig anders, übernimmt es die Liste, anstatt einen einzelnen Wert als Argument. |
Listen () | Und Artikel () ist ein wenig anders, wird es alle wichtigen Werte zurück, als eine Liste, zum Beispiel: >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])] |
urlencode () | Gibt einen String formatiert, um die Abfrage-String-Format durchführen (zB "a = 2 & b = 3 & b = 5"). |