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': |
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:
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:
META ces en-têtes préfixés HTTP_ plus Key, par exemple:
|
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"). |