Latest web development tutorials

formularze Django

Formularze są klasycznym sposobem interaktywna strona internetowa. Ten rozdział wyjaśnia, jak radzić sobie z danych formularzy Django składanych przez użytkownika.


żądania HTTP

Protokół HTTP "Zapytanie - odpowiedź" sposób. Gdy klient wysyła żądanie, można zażądać dodatkowych danych. Prośba o rozdzielczości Server, można uzyskać dane od klienta i do świadczenia określonych usług na podstawie adresu URL.

Metoda GET

Stworzyliśmy search.py ​​plik przed projektem, do odbierania żądania użytkownika:

# -*- 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)

Dodaj search_form.html formularz szablonu w katalogu szablonów:

<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 reguły wprowadza się następujące zmiany:

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),
)

Adres dostępu: http: //192.168.45.3: 8000 / search-form / i wyszukiwania, wyniki przedstawiają się następująco:

metoda POST

Przede użyliśmy metody GET. Zobacz wyświetlacz oraz funkcje przetwarzania żądania na dwie leczenia.

Częściej POST sposobu przekazywania danych. Używamy następujący tej metody, z adresem URL i obsługi, a także pokazuje widok i przetworzyć żądania.

Stworzyliśmy post.html w 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>

Pod koniec szablonu dodaliśmy RLT znak zastępczy dla wyników tabeli.

Istnieje również stół {%}% csrf_token tag później. csrf oznacza cross-site request forgery. Jest dostarczana przez Django uniemożliwić fałszowanie składać wnioski. Metoda POST przesłać formularz, musisz mieć tę etykietę.

Nowy plik search2.py w katalogu HelloWorld i użyć funkcji search_post obsługiwać żądania 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)

urls.py reguły wprowadza się następujące zmiany:

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),
)

Dostęp http://192.168.45.3:8000/search-post/~~number=plural Pokaż wyniki w następujący sposób:

Po zakończeniu powyższych przykładach, nasza struktura katalogów:

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

Obiekt żądania

Każda funkcja widoku pierwszy argument jest obiektem HttpRequest, tuż poniżej funkcji Hello ():

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

HttpRequest obiekt zawiera informacje o aktualnym adresie URL żądania:

nieruchomość

opis

ścieżka

Pełna ścieżka do żądanej strony, a nie w tym nazwy domeny - na przykład "/ hello /".

metoda

Metoda HTTP ciąg używany w reprezentacji żądania. Reprezentuje wszystko wielkimi literami. Na przykład:

jeśli request.method == 'GET':
do_something ()
Elif request.method == 'POST':
do_something_else ()

GET

Zawiera on wszystkie parametry HTTP GET słownika podobny obiekt. Zobacz dokumentację QueryDict.

POST

Zawiera on wszystkie parametry HTTP POST słownika takiego obiektu. Zobacz dokumentację QueryDict.

Sytuacja żądania POST serwer odbiera pusty jest również możliwe. Innymi słowy, forma Formularz złożyć wniosek za pośrednictwem metody HTTP POST, ale nie mogą stanowić dane. W związku z tym oświadczenie nie może być stosowane, jeżeli request.POST celu ustalenia, czy stosowanie metody HTTP POST, należy użyć, jeśli request.method == "POST" (patrz ten atrybut metody tabeli).

Uwaga: POST nie zawiera informacji file-upload. Patrz Pliki właściwości.

WNIOSEK

Dla wygody, ten obiekt jest zbiorem POST i GET atrybut, ale szczególny, sprawdzanie post jest pierwszy obiekt, a następnie spójrz GET atrybut. Odniesienie PHP _REQUEST $.

Na przykład, jeśli uzyska = { "name": "John"} i post = { "wiek": '34'}, następnie wniosek [ "nazwa"] wartość "Jan", [ "wiek"] wartość prośba jest "34."

Zaleca się, aby korzystać z GET i POST, ponieważ te dwa atrybuty bardziej wyraźne, pisemne kod łatwiejszy do zrozumienia.

COOKIES

Wszystkie ciasteczka zawierają standardowe Pythona obiekt Dictionary. Klucze i wartości są ciągami. Patrz rozdział 12, nie ma bardziej szczegółowych wyjaśnień dotyczących cookies.

PLIKI

Słownik podobny obiekt zawierający wszystkie przesłane pliki. . Plików każdy klucz jest <input type = "file" name = "" /> wartość atrybutu name zaznaczania plików każda wartość jest również standard obiektu słownika Pythona, który zawiera następujące trzy przyciski:

  • Nazwa pliku: Wyślij nazwę pliku z reprezentacją ciąg Pythona
  • Typ treść przesłanego pliku: Content-Type
  • Oryginalna treść przesłanego pliku: Zawartość

Uwaga: Tylko metoda żądania jest POST, a strona Żądanie <form> ma enctype = "multipart / form-data" atrybut tylko pliki posiadające danych. W przeciwnym wypadku plików jest pusty słownik.

META

Zawierającą wszystkie dostępne słownika nagłówki HTTP. Na przykład:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: nierozwiązana oryginalny łańcuch zapytania
  • Adres IP klienta: REMOTE_ADDR
  • REMOTE_HOST: klient nazwa hosta
  • SERVER_NAME: Serwer Nazwa hosta
  • SERVER_PORT: port serwera

META te nagłówki prefiksem HTTP_ najbardziej Key, na przykład:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP nagłówek hosta wysyłane przez klienta
  • HTTP_REFERER: odnosząc stronę
  • HTTP_USER_AGENT: user-agent string klienta
  • HTTP_X_BENDER: X-Bender header

użytkownik

Django.contrib.auth.models.User jest obiektem, który reprezentuje użytkownika aktualnie zalogowanego użytkownika.

Jeśli masz dostęp użytkownik nie jest aktualnie zalogowany użytkownik zostanie zainicjowany instancji django.contrib.auth.models.AnonymousUser.

Możesz być zidentyfikowane przez is_authenticated () Metoda użytkownika z użytkownik jest zalogowany:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.

Django aktywna tylko wtedy, gdy AuthenticationMiddleware Obiekt jest dostępny

sesja

Jedynym nieruchomość zapisu, który reprezentuje bieżącą sesję słownika obiektu. Django aktywna tylko wtedy, gdy sesja obsługiwana właściwość jest dostępna. Patrz rozdział 12.

raw_post_data

Surowe dane POST HTTP, a nie analizowany. Być przydatne, gdy wyprzedza leczenie.

Zapytanie Obiekt posiada również kilka przydatnych metod:

sposób opis
__getitem __ (klucz) Zwraca klucze GET / POST, najpierw wziąć POST, GET po zażyciu. Jeśli klucz nie istnieje rzut KeyError.
To, co możemy użyć składni dostępu do słownika HttpRequest obiekt.
Na przykład, może zażądać [ "foo"] jest równoznaczne z pierwszej request.POST [ "foo"], a następnie request.GET [ "foo"] operacji.
has_key () Sprawdź request.GET lub parametr request.POST określa, czy zawierają klucz.
get_full_path () Powrót żądanie trasy zawiera ciąg zapytań. Na przykład "/ muzyka / zespoły / the_beatles /? Print = true"
is_secure () Jeżeli wniosek jest bezpieczny powrót prawda, to znaczy, że światło emitowane jest HTTPS.

obiekty QueryDict

W HttpRequest obiekt, GET i POST atrybuty są instancje klasy django.http.QueryDict.

QueryDict podobnej klasy słownika użytkownika do obsługi przypadku wielu wartości odpowiadającej wiązaniem pojedynczym.

QueryDict realizacji wszystkich standardowych metod słownikowych. Sposób ten obejmuje także konkretne:

sposób opis

__getitem__

Standardowy proces słownik jest nieco inna, to znaczy, gdy odpowiednia liczba kluczową wartością, __ GetItem __ () zwraca ostatnią wartość.

__setitem__

Ustawienie parametru określa wartość listę kluczowych (lista Python). Uwaga: może być ona wywołana tylko (kopia jest za pośrednictwem kopii () wygenerowany obiekt QueryDict) na zmienny obiektu QueryDict.

get ()

Jeśli klawisz odpowiadający wielu wartości get () zwraca ostatnią wartość.

update ()

Parametry mogą być QueryDict, może być standardowym słowniku. Zróżnicowany standard metoda aktualizacji słownika oraz metodę dodawania pozycji słownika, zamiast zastąpić je:

>>> 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']

przedmiotów ()

Są to standardowe elementy słowniku () Metoda ta jest nieco inna metoda wykorzystuje pojedynczy wartościach logicznych __getitem __ ():

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]

Wartości ()

Standardowe wartości w słowniku () Metoda ta jest nieco inna metoda wykorzystuje pojedynczy wartościach logicznych __getitem __ ():

Ponadto QueryDict istnieją pewne sposoby, w poniższej tabeli:

sposób opis

copy ()

Zwraca kopię obiektu, wdrożenie wewnętrznego w Pythonie biblioteki standardowej copy.deepcopy (). Ta kopia jest zmienne (zmienne) - czyli, można zmienić wartość kopii.

getlist (klucz)

Wszystkie parametry i zwracane wartości właściwego klucza, ponieważ lista Python zwrócone. Jeśli klucz nie istnieje, zwraca pustą listę. To gwarantuje, aby powrócić do listy jakimś ..

Setlista (key, list_)

Ustaw wartość klucza list_ (w przeciwieństwie __setitem __ ()).

appendlist (key, item)

Dodaj element do klucza i związanego z listy wewnętrznego.

setlistdefault (key, lista)

I setDefault trochę inaczej, akceptuje listę zamiast pojedynczej wartości jako argumentu.

list ()

I elementy () jest nieco inna, zwróci wszystkie kluczowe wartości, w postaci listy, na przykład:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]

urlencode ()

Zwraca ciąg sformatowany wykonywać format łańcucha zapytania (np: "a = b = 2 & 3 & b = 5").