Latest web development tutorials

formes Django

les formulaires HTML sont le site Web interactif de façon classique. Ce chapitre explique comment traiter les données de formulaire Django soumis par un utilisateur.


demande HTTP

Protocole HTTP "Request - Répondre" manière. Lorsque le client envoie une requête, vous pouvez demander des données supplémentaires. demande de résolution du serveur, vous pouvez obtenir des données du client, et de fournir des services spécifiques basés sur URL.

Méthode GET

Nous avons créé un fichier search.py ​​avant que le projet, pour recevoir une demande de l'utilisateur:

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

Ajouter search_form.html modèle de formulaire dans le répertoire de modèle:

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

règle urls.py est modifié comme suit:

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

Adresse d'accès: http: //192.168.45.3: 8000 / search-forme / et la recherche, les résultats sont les suivants:

méthode POST

Au-dessus, nous avons utilisé la méthode GET. Voir l'affichage et des fonctions de traitement de demande en deux traitements.

Plus communément POST méthode pour soumettre les données. Nous utilisons la présente méthode suivante, avec une URL et des gestionnaires, montre aussi la vue et traiter la demande.

Nous avons créé post.html en 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>

A la fin du modèle, nous avons ajouté une marque de réservation RLT pour les résultats de la table.

Il y a aussi une table {% csrf_token%} tag plus tard. csrf signifie Cross Site Request Forgery. Ceci est fourni par Django prévenir la falsification de soumettre des demandes. la méthode POST pour soumettre le formulaire, vous devez avoir cette étiquette.

Nouveau fichier search2.py dans le répertoire HelloWorld et utiliser la fonction search_post pour gérer les requêtes 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)

règle urls.py est modifié comme suit:

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

Accès http://192.168.45.3:8000/search-post/~~number=plural Résultats comme suit:

Après l'achèvement des exemples ci-dessus, notre structure de répertoire:

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

Demande Object

Chaque fonction de vue le premier argument est un objet HttpRequest, juste en dessous de la fonction bonjour ():

from django.http import HttpResponse

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

HttpRequest objet contient des informations sur la demande actuelle URL:

propriété

description

chemin

Le chemin d'accès complet à la page demandée, ne comprenant pas le nom de domaine - par exemple, "/ bonjour /".

méthode

String La méthode HTTP utilisée dans la représentation de la demande. Elle représente toutes les majuscules. Par exemple:

si request.method == 'GET':
do_something ()
elif request.method == 'POST':
do_something_else ()

GET

Il contient tous les paramètres HTTP GET-dictionnaire objet. Voir la documentation QueryDict.

POST

Il contient tous les paramètres HTTP POST objet similaire à un dictionnaire. Voir la documentation QueryDict.

demande POST Situation serveur reçoit vide est également possible. En d'autres termes, la forme de formulaire pour soumettre une demande via la méthode HTTP POST, mais ne peut pas former des données. Par conséquent, la déclaration ne peut pas être utilisé si request.POST pour déterminer si vous souhaitez utiliser la méthode HTTP POST, vous devez utiliser si request.method == "POST" (voir ce tableau méthode attribut).

Note: POST ne comprend pas les informations de téléchargement de fichier. Voir FICHIERS propriétés.

DEMANDE

Pour plus de commodité, cette propriété est une collection de POST et GET attribut, mais il particularité, la vérification POST première propriété, puis regarder GET attribut. de $ _REQUEST Référence PHP.

Par exemple, si vous obtenez = { "name": "john"} et POST = { "age": '34'}, puis DEMANDER [ "nom"] valeur est "john", [ "age"] la valeur de demande est "34."

Il est fortement recommandé d'utiliser GET et POST, parce que ces deux attributs d'une plus explicite, écrit le code plus facile à comprendre.

BISCUITS

Tous les cookies contiennent un objet de dictionnaire Python standard. Clés et les valeurs sont des chaînes. Voir le chapitre 12, il y a une explication plus détaillée sur les cookies.

FICHIERS

objet Dictionary comme contenant tous les fichiers téléchargés. . FICHIERS Chaque clé est <input type = "file" name = "" /> valeur de l'attribut de nom de balise FICHIERS chaque valeur est aussi un objet Python dictionnaire standard qui contient les trois touches suivantes:

  • filename: Ajouter un nom de fichier avec une représentation de chaîne de Python
  • Type de contenu du fichier téléchargé: content-type
  • Le contenu original fichier téléchargé: contenu

Remarque: Seule la méthode de requête est POST, et la page de demande <form> a enctype = "multipart / form-data" attribut uniquement les fichiers qui contiennent des données. Sinon, FILES est un dictionnaire vide.

META

Contenant tous les en-têtes HTTP dictionnaire disponibles. Par exemple:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: suspens chaîne de requête d'origine
  • l'adresse IP du client: REMOTE_ADDR
  • REMOTE_HOST: nom d'hôte du client
  • SERVER_NAME: Nom du serveur hôte
  • SERVER_PORT: port du serveur

META ces en-têtes préfixés HTTP_ plus Key, par exemple:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP informations d'en-tête de l'hôte envoyé par le client
  • HTTP_REFERER: page de référence
  • HTTP_USER_AGENT: chaîne user-agent du client
  • HTTP_X_BENDER: X-Bender tête

utilisateur

Django.contrib.auth.models.User est un objet qui représente l'utilisateur actuellement connecté.

Si vous accédez à l'utilisateur est actuellement pas connecté, l'utilisateur sera initialisée instance de django.contrib.auth.models.AnonymousUser.

Vous pouvez être identifié par is_authenticated () la méthode de l'utilisateur d'un utilisateur est connecté:

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

Django activé uniquement lorsque le AuthenticationMiddleware La propriété est disponible

session

La seule propriété inscriptible qui représente la session en cours de l'objet dictionnaire. Django activé uniquement lorsque la session a soutenu la propriété est disponible. Voir le chapitre 12.

raw_post_data

les données HTTP POST brutes, pas analysés. Soyez utile lorsque avancé traitement.

Demande objet a aussi quelques méthodes utiles:

manière description
__getitem __ (key) Renvoie les touches GET / POST, prendre la première POST, après la prise de GET. Si la clé n'existe pas KeyError lancer.
Ceci est ce que nous pouvons utiliser la syntaxe dictionnaire pour accéder HttpRequest objet.
Par exemple, demander [ "foo"] est équivalent à la première request.POST [ "foo"] puis request.GET [ "foo"] opération.
has_key () Vérifiez request.GET ou paramètre request.POST spécifie si vous souhaitez inclure la clé.
get_full_path () demande de chemin de retour contient une chaîne de requête. Par exemple, "/ musique / groupes / the_beatles /? Imprimer = true"
is_secure () Si la demande est sûr, le retour est vrai, qui est, la lumière émise est HTTPS.

objets QueryDict

Dans HttpRequest objet, GET et POST attributs sont des instances de la classe django.http.QueryDict.

QueryDict dictionnaire personnalisé similaire classe pour gérer le cas de multi-valeur correspondant à une liaison simple.

QueryDict mettre en œuvre toutes les méthodes de dictionnaire standard. Le procédé comprend également spécifique:

manière description

__getitem__

dictionnaire standard processus est un peu différent, qui est, si le nombre correspondant de valeur de clé, __ getitem __ () retourne la dernière valeur.

__setitem__

Réglage paramètre spécifie la valeur d'une liste de clés (une liste Python). Note: Il ne peut être appelé (copie est à travers la copie () généré un objet QueryDict) sur un objet QueryDict mutable.

get ()

Si la touche correspondant à la pluralité de la valeur, get () retourne la dernière valeur.

update ()

Les paramètres peuvent être QueryDict, il peut être un dictionnaire standard. méthode dictionnaire de mise à jour standard différent et la méthode consistant à ajouter les éléments du dictionnaire, plutôt que de les remplacer:

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

articles ()

Il y a les éléments du dictionnaire standard () méthode est un peu différent, la méthode utilise une valeur unique __getitem __ logique ():

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

>>> q.items()

[('a', '3')]

(valeurs)

Les valeurs de dictionnaire standard () est un peu différent, la méthode utilise une seule valeur logique __getitem __ ():

En outre, QueryDict il existe quelques méthodes, le tableau suivant:

manière description

copy ()

Renvoie une copie de l'objet, la mise en œuvre interne en Python copy.deepcopy bibliothèque standard (). Cette copie est mutable (modifiable) - qui est, vous pouvez modifier la valeur de la copie.

GetList (key)

Tous les paramètres et les valeurs de retour de la touche correspondante, comme une liste de Python retourné. Si la clé n'existe pas, il retourne une liste vide. Il est garanti pour retourner une liste de quelque sorte ..

setlist (clé, list_)

Définir la clé list_ de valeur (contrairement à __setitem __ ()).

appendlist (key, item)

Ajouter l'article à la clé et la liste interne associée.

setlistdefault (clé, liste)

Et setdefault un peu différent, il accepte la liste plutôt que d'une seule valeur comme argument.

listes ()

Et les articles () est un peu différent, il retournera toutes les valeurs clés, comme une liste, par exemple:

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

>>> q.lists()

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

urlencode ()

Renvoie une chaîne formatée pour effectuer le format de chaîne de requête (par exemple, "a = 2 & b = 3 & b = 5").