Latest web development tutorials

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.html')

# 接收请求数据
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.html 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.html 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.html", 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.html
    |-- hello.html
    |-- post.html
    `-- search_form.html

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':
do_something ()
Elif request.method == 'POST':
do_something_else ()

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:

  • Dateiname: Laden Sie einen Dateinamen mit einem String-Darstellung von Python
  • Inhaltstyp der hochgeladenen Datei: content-type
  • Original-Inhalt hochgeladene Datei: Inhalt

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:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: ungelöst ursprünglichen Abfrage-String
  • REMOTE_ADDR: IP-Adresse des Clients
  • REMOTE_HOST: Client-Host-Namen
  • SERVER_NAME: Server-Hostname
  • SERVER_PORT: Server-Port

META diese Header voran HTTP_ meisten Key, zum Beispiel:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP-Host-Header-Informationen vom Client gesendeten
  • HTTP_REFERER: verweisenden Seite
  • HTTP_USER_AGENT: der User-Agent-String des Kunden
  • HTTP_X_BENDER: X-Bender-Header

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 ..

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").