bentuk Django
bentuk HTML adalah cara website interaktif klasik. Bab ini menjelaskan bagaimana menangani data formulir Django yang diajukan oleh pengguna.
permintaan HTTP
HTTP protokol "Permintaan - Reply" cara. Ketika klien mengirimkan permintaan, Anda dapat meminta data tambahan. permintaan resolusi Server, Anda bisa mendapatkan data dari klien, dan untuk menyediakan layanan tertentu berdasarkan URL.
GET Metode
Kami menciptakan sebuah file search.py sebelum proyek, untuk menerima permintaan pengguna:
# -*- 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)
Tambahkan bentuk template search_form.html di direktori template:
<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>
Aturan urls.py diubah sebagai berikut:
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), )
alamat akses: http: //192.168.45.3: 8000 / pencarian bentuk / dan pencarian, hasilnya adalah sebagai berikut:
metode POST
Di atas kita menggunakan metode GET. Lihat tampilan dan fungsi pengolahan permintaan menjadi dua pengobatan.
Lebih umum POST metode untuk mengirimkan data. Kami menggunakan metode ini sebagai berikut, dengan URL dan penangan, juga menunjukkan pandangan dan memproses permintaan.
Kami menciptakan post.html di 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>
Pada akhir template, kami menambahkan tanda placeholder RLT untuk hasil tabel.
Ada juga meja {% csrf_token%} tag kemudian. CSRF adalah singkatan dari Cross Site Request Pemalsuan. Ini disediakan oleh Django mencegah pemalsuan mengajukan permintaan. Metode POST untuk mengirimkan formulir, Anda harus memiliki label ini.
File search2.py baru di direktori HelloWorld dan menggunakan fungsi search_post untuk menangani permintaan 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)
Aturan urls.py diubah sebagai berikut:
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), )
Akses http://192.168.45.3:8000/search-post/ Tampilan hasil sebagai berikut:
Setelah selesai dari contoh di atas, struktur direktori kami:
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
Permintaan Obyek
Setiap fungsi tampilan argumen pertama adalah obyek HttpRequest, tepat di bawah hello () fungsi:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
objek HttpRequest berisi beberapa informasi tentang URL permintaan saat ini:
milik | deskripsi |
path | Path lengkap ke halaman yang diminta, tidak termasuk nama domain - misalnya, "/ halo /". |
metode | Metode String HTTP digunakan dalam representasi permintaan. Ini mewakili semua huruf besar. Sebagai contoh: jika request.method == 'GET': |
GET | Ini berisi semua HTTP GET parameter objek kamus-seperti. Lihat dokumentasi QueryDict. |
POST | Ini berisi semua parameter HTTP POST kamus-seperti objek. Lihat dokumentasi QueryDict. Situasi permintaan POST server menerima kosong juga mungkin. Dengan kata lain, bentuk formulir untuk mengirimkan permintaan melalui metode HTTP POST, tetapi tidak dapat membentuk data. Oleh karena itu, pernyataan itu tidak dapat digunakan jika request.POST untuk menentukan apakah akan menggunakan metode HTTP POST, Anda harus menggunakan jika request.method == "POST" (lihat tabel ini metode atribut). Catatan: POST tidak termasuk informasi file-upload. Lihat FILES properti. |
REQUEST | Untuk kenyamanan, properti ini adalah kumpulan POST dan GET atribut, tapi ada kekhususan, memeriksa POST properti pertama, kemudian lihat GET atribut. Referensi PHP $ _REQUEST. Misalnya, jika Anda GET = { "name": "john"} dan POST = { "usia": '34'}, kemudian MEMINTA [ "nama"] nilai adalah "john", [ "usia"] nilai REQUEST adalah "34." Hal ini sangat dianjurkan untuk menggunakan GET dan POST, karena kedua atribut yang lebih eksplisit, ditulis kode lebih mudah untuk memahami. |
COOKIES | Semua cookie berisi standar Python kamus objek. Kunci dan nilai-nilai string. Lihat Bab 12, ada penjelasan yang lebih rinci tentang cookie. |
FILES | Kamus-seperti objek yang berisi semua file upload. . File Setiap Key adalah <input type = "file" name = "" /> nama tag nilai atribut FILES setiap nilai juga merupakan objek Python kamus standar yang berisi tiga Keys berikut:
Catatan: Hanya metode permintaan adalah POST, dan halaman permintaan <form> memiliki enctype = "multipart / form-data" atribut FILES hanya memiliki data. Jika tidak, FILES adalah kamus kosong. |
META | Mengandung semua tersedia header HTTP kamus. Sebagai contoh:
META header ini diawali HTTP_ paling Key, misalnya:
|
pemakai | Django.contrib.auth.models.User adalah obyek yang mewakili pengguna saat login. Jika Anda mengakses pengguna saat ini belum login, pengguna akan diinisialisasi contoh django.contrib.auth.models.AnonymousUser. Anda dapat diidentifikasi dengan is_authenticated metode pengguna () dari pengguna login: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. Django diaktifkan hanya ketika AuthenticationMiddleware properti ini tersedia |
sidang | Satu-satunya properti yang bisa ditulis yang mewakili sesi saat ini objek kamus. Django diaktifkan hanya ketika sesi didukung properti yang tersedia. Lihat Bab 12. |
raw_post_data | Data HTTP POST mentah, tidak diurai. Berguna saat maju pengobatan. |
Permintaan objek juga memiliki beberapa metode yang berguna:
cara | deskripsi |
---|---|
__getitem __ (key) | Mengembalikan tombol GET / POST, pertama mengambil POST, setelah mengambil GET. Jika kunci tidak ada KeyError lemparan. Ini adalah apa yang dapat kita gunakan sintaks kamus untuk mengakses objek HttpRequest. Misalnya, meminta [ "foo"] setara dengan request.POST pertama [ "foo"] kemudian request.GET [ "foo"] operasi. |
has_key () | Periksa request.GET atau request.POST parameter menentukan apakah akan menyertakan Key. |
get_full_path () | permintaan kembali jalur mengandung string query. Misalnya, "/ music / band / the_beatles /? Print = true" |
is_secure () | Jika permintaan tersebut aman, kembali Benar, yaitu, cahaya yang dipancarkan adalah HTTPS permintaan. |
benda QueryDict
Dalam HttpRequest objek, GET dan atribut POST adalah contoh kelas django.http.QueryDict.
QueryDict kelas kamus khusus yang mirip dengan menangani kasus multi-nilai yang sesuai dengan ikatan tunggal.
QueryDict menerapkan semua metode kamus standar. Metode ini juga termasuk yang spesifik:
cara | deskripsi |
---|---|
__getitem__ | Proses kamus standar sedikit berbeda, yaitu, jika angka yang sesuai Key Nilai, __ getItem __ () mengembalikan nilai terakhir. |
__setitem__ | Pengaturan parameter menentukan nilai dari daftar kunci (daftar Python). Catatan: Ini hanya dapat disebut (copy melalui copy () dihasilkan benda QueryDict) pada objek QueryDict bisa berubah. |
mendapatkan () | Jika kunci yang sesuai dengan pluralitas nilai, dapatkan () mengembalikan nilai terakhir. |
update () | Parameter dapat QueryDict, itu bisa menjadi kamus standar. Berbeda standar metode update kamus dan metode menambahkan item kamus, daripada menggantinya: >>> 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'] |
item () | Ada item kamus standar () metode ini sedikit berbeda, metode ini menggunakan logika __getitem __ bernilai tunggal (): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
nilai-nilai () | Nilai-nilai kamus standar () metode ini sedikit berbeda, metode ini menggunakan logika __getitem __ bernilai tunggal (): |
Selain itu, QueryDict ada beberapa metode, tabel berikut:
cara | deskripsi |
---|---|
copy () | Mengembalikan salinan dari objek, pelaksanaan internal Python standar copy.deepcopy perpustakaan (). copy ini bisa berubah (berubah) - yaitu, Anda dapat mengubah nilai salinan. |
getList (key) | Semua parameter dan mengembalikan nilai-nilai yang sesuai kunci, sebagai daftar Python kembali. Jika kunci tidak ada, ia mengembalikan daftar kosong. Ini dijamin untuk kembali daftar dari beberapa macam .. |
setlist (kunci, list_) | Set nilai kunci list_ (tidak seperti __setitem __ ()). |
appendlist (kunci, item) | Menambahkan item ke tombol dan daftar internal terkait. |
setlistdefault (kunci, daftar) | Dan setdefault sedikit berbeda, ia menerima daftar daripada nilai tunggal sebagai argumen. |
daftar () | Dan item () adalah sedikit berbeda, ia akan mengembalikan semua nilai-nilai kunci, sebagai daftar, misalnya: >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])] |
urlencode () | Mengembalikan string diformat untuk melakukan format string (misalnya, "a = 2 & b = 3 & b = 5"). |