forme Django
moduli HTML sono il classico sito web interattivo modo. Questo capitolo spiega come gestire i dati del modulo Django presentate da un utente.
richiesta HTTP
Protocollo HTTP "Richiesta - Reply" maniera. Quando il client invia una richiesta, è possibile richiedere ulteriori dati. richiesta di risoluzione Server, è possibile ottenere i dati dal client, e per fornire specifici servizi basati su URL.
metodo GET
Abbiamo creato un file search.py prima che il progetto, per la ricezione di una richiesta dell'utente:
# -*- 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)
Aggiungere modello di modulo search_form.html nella directory dei modelli:
<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>
regola urls.py è modificato come segue:
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), )
indirizzo di accesso: http: //192.168.45.3: 8000 / search-forma / e di ricerca, i risultati sono i seguenti:
metodo POST
Sopra abbiamo usato il metodo GET. Vista display e funzioni di elaborazione richiesta in due trattamento.
Più comunemente POST metodo per inviare i dati. Usiamo il seguente questo metodo, con un URL e gestori, mostra anche la vista e elaborare la richiesta.
Abbiamo creato 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>
Alla fine del modello, abbiamo aggiunto un segnaposto segno di RLT per i risultati del tavolo.
C'è anche una tabella di tag {% csrf_token%} tardi. CSRF acronimo di Cross Site Request Forgery. Questo è fornito da Django a prevenire la contraffazione inviare richieste. metodo POST per inviare il modulo, è necessario disporre di questa etichetta.
Nuovo file search2.py nella directory HelloWorld e utilizzare la funzione search_post per gestire le richieste POST:
# -*- 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)
regola urls.py è modificato come segue:
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), )
http://192.168.45.3:8000/search-post/~~number=plural Accesso Risultati come segue:
Dopo il completamento dei suddetti esempi, la nostra struttura directory:
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
Object Request
Ogni funzione di visualizzazione il primo argomento è un oggetto HttpRequest, appena sotto la funzione ciao ():
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
HttpRequest oggetto contiene alcune informazioni sulla URL richiesta corrente:
proprietà | descrizione |
sentiero | Il percorso completo della pagina richiesta, non compreso il nome di dominio - per esempio, "/ ciao /". |
metodo | Metodo String HTTP utilizzato nella rappresentazione richiesta. Rappresenta tutto in maiuscolo. Ad esempio: se request.method == 'GET': |
GET | Contiene tutte HTTP ottenere i parametri dizionario-come oggetto. Vedere la documentazione QueryDict. |
POST | Esso contiene tutti i parametri HTTP POST oggetto dizionario-like. Vedere la documentazione QueryDict. Situazione richiesta POST server riceve vuoto è anche possibile. In altre parole, la forma form per inviare una richiesta tramite il metodo HTTP POST, ma non può formare i dati. Pertanto, la dichiarazione non può essere utilizzato se request.POST per determinare se utilizzare il metodo HTTP POST, si dovrebbe usare se request.method == "POST" (si veda questo attributo metodo della tabella). Nota: POST non include le informazioni sul file-upload. Vedere file di proprietà. |
RICHIESTA | Per comodità, questa struttura è una raccolta di POST e GET attributo, ma ci particolarità, controllando POST prima proprietà, poi guardare GET attributo. di $ _REQUEST PHP. Ad esempio, se si ottiene = { "name": "John"} e POST = { "età": '34'}, quindi richiesta [ "nome"] valore è "John", [ "età"] il valore della richiesta viene "34." Si raccomanda vivamente di utilizzare GET e POST, perché questi due attributi di un più esplicito, scritto il codice più facile da capire. |
COOKIES | Tutti i cookie contengono oggetto dizionario standard di Python. Chiavi e valori sono stringhe. Vedere il Capitolo 12, vi è una spiegazione più dettagliata sui cookie. |
FILE | Dizionario-come oggetto che contiene tutti i file caricati. . I file di ogni tasto è <input type = nome di "file" = "" /> valore di attributo nome del tag file ogni valore è anche un oggetto dizionario Python standard che contiene i seguenti tre tasti:
Nota: solo il metodo di richiesta è POST, e la pagina di richiesta <form> ha enctype = "/ form-data" multipart attributo file solo avere i dati. In caso contrario, Files è un dizionario vuoto. |
META | Contenente tutti dizionario intestazioni HTTP disponibile. Ad esempio:
META queste intestazioni precedute HTTP_ più chiave, ad esempio:
|
utente | Django.contrib.auth.models.User è un oggetto che rappresenta l'utente attualmente connesso. Se si accede l'utente non è attualmente connesso, l'utente verrà inizializzato istanza di django.contrib.auth.models.AnonymousUser. Si può essere identificato con il metodo is_authenticated dell'utente () di un utente è connesso: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. Django attivato solo quando la AuthenticationMiddleware La proprietà è disponibile |
sessione | L'unica proprietà scrivibile che rappresenta la sessione corrente dell'oggetto dizionario. Django attivata solo quando la sessione ha sostenuto la proprietà è disponibile. Vedere il Capitolo 12. |
raw_post_data | dati HTTP POST grezzi, non analizzati. Essere utile quando avanzato trattamento. |
Richiesta oggetto ha anche alcuni metodi utili:
modo | descrizione |
---|---|
__getitem __ (chiave) | Restituisce i tasti GET / POST, in primo luogo prendere POST, dopo l'assunzione di GET. Se la chiave non esiste KeyError tiro. Questo è ciò che possiamo utilizzare la sintassi dizionario per accedere HttpRequest oggetto. Ad esempio, richiesta [ "foo"] è equivalente al primo request.POST [ "foo"] then request.GET [ "foo"] operazione. |
has_key () | Controllare request.GET o parametro request.POST di specificare se includere la chiave. |
get_full_path () | Richiesta percorso di ritorno contiene una stringa di query. Ad esempio, "/ music / band / the_beatles / Stampa = true" |
is_secure () | Se la richiesta è sicura, restituirà True, cioè, la luce emessa è HTTPS richieste. |
oggetti QueryDict
In HttpRequest oggetto, GET e POST attributi sono istanze della classe django.http.QueryDict.
QueryDict simile classe di dizionario personalizzato per gestire il caso di multi-valore corrispondente ad un singolo legame.
QueryDict implementare tutti i metodi dei dizionari standard. Il metodo comprende anche specifici:
modo | descrizione |
---|---|
__getitem__ | processo dizionario standard è un po 'diverso, vale a dire, se il corrispondente numero di Chiave Valore, __ getitem __ () restituisce l'ultimo valore. |
__setitem__ | Impostazione parametro specifica il valore di un elenco di chiave (una lista Python). Nota: Si può essere chiamato solo (copia è attraverso la copia () generato un oggetto QueryDict) su un oggetto QueryDict mutabile. |
get () | Se il tasto corrispondente alla pluralità di valori, get () restituisce l'ultimo valore. |
update () | I parametri possono essere QueryDict, può essere un dizionario standard. Diverso metodo di aggiornamento dizionario standard e il metodo di aggiunta delle voci del dizionario, anziché sostituire: >>> 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'] |
articoli () | Ci sono le voci del dizionario standard () metodo è un po 'diverso, il metodo utilizza una logica __getitem __ valore singolo (): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
valori () | I valori dizionario standard () metodo è un po 'diverso, il metodo utilizza un unico valore logica __getitem __ (): |
Inoltre, QueryDict ci sono alcuni metodi, la seguente tabella:
modo | descrizione |
---|---|
copy () | Restituisce una copia dell'oggetto, l'implementazione interna in Python copy.deepcopy libreria standard (). Questa copia è mutevole (modificabile) - vale a dire, è possibile modificare il valore della copia. |
GetList (chiave) | Tutti i parametri ei valori restituiti del tasto corrispondente, come una lista Python restituito. Se la chiave non esiste, restituisce una lista vuota. E 'garantito per restituire un elenco di qualche tipo .. |
setlist (chiave, List_) | Impostare la chiave valore List_ (a differenza __setitem __ ()). |
appendlist (chiave, voce) | Aggiungere la voce alla chiave e la lista interna associata. |
setlistdefault (chiave, lista) | E setDefault un po 'diverso, accetta la lista, piuttosto che un singolo valore come argomento. |
liste () | E gli elementi () è un po 'diverso, si tornerà tutti i valori chiave, come una lista, per esempio: >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])] |
UrlEncode () | Restituisce una stringa formattata per eseguire il formato stringa di ricerca (ad esempio, "a = 2 & b = 3 & b = 5"). |