Latest web development tutorials

formas de Django

formularios HTML son la página web clásico de manera interactiva. En este capítulo se explica cómo tratar con los datos del formulario de Django presentadas por un usuario.


solicitud HTTP

El protocolo HTTP "de pregunta - respuesta" manera. Cuando el cliente envía una solicitud, puede solicitar datos adicionales. solicitud de resolución de servidor, puede obtener los datos desde el cliente, y para proporcionar servicios específicos basados ​​en URL.

método GET

Hemos creado un archivo search.py ​​antes del proyecto, para la recepción de una solicitud del usuario:

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

Añadir plantilla de formulario search_form.html en el directorio de plantillas:

<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 regla se modifica como sigue:

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

dirección de acceso: http: //192.168.45.3: 8000 / search-forma / y de búsqueda, los resultados son los siguientes:

método POST

Por encima se utilizó el método GET. Vista de la pantalla y las funciones de procesamiento de solicitudes en dos tratamientos.

Más comúnmente método POST para enviar datos. Utilizamos el siguiente este método, con una URL y manipuladores, también muestra la vista y procesar la solicitud.

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

Al final de la plantilla, hemos añadido un marcador de posición para la marca de RLT los resultados de la tabla.

También hay una mesa de etiqueta {%}% csrf_token más tarde. csrf significa Cross Site Request falsificación. Esta es proporcionada por Django prevenir la falsificación presentar solicitudes. método POST para enviar el formulario, debe tener esta etiqueta.

Search2.py nuevo archivo en el directorio de HelloWorld y utilizar la función search_post para manejar peticiones 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 regla se modifica como sigue:

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 acceso Mostrar resultados de la siguiente manera:

Después de la terminación de los ejemplos anteriores, nuestra estructura de directorios:

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

Cada función de vista el primer argumento es un objeto HttpRequest, justo debajo de la función hello ():

from django.http import HttpResponse

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

HttpRequest objeto contiene alguna información acerca de la URL de la solicitud actual:

propiedad

descripción

camino

La ruta completa a la página solicitada, sin incluir el nombre de dominio - por ejemplo, "/ hola /".

método

método de cadena HTTP utilizado en la representación petición. Representa todo en mayúsculas. Por ejemplo:

si request.method == 'GET':
hacer_algo ()
elif request.method == 'post':
do_something_else ()

GET

Contiene toda HTTP GET parámetros de diccionario-como objeto. Consulte la documentación QueryDict.

POSTAL

Contiene todos los parámetros HTTP POST objeto de diccionario similar. Consulte la documentación QueryDict.

solicitud POST situación servidor recibe vacía también es posible. En otras palabras, la forma de presentar un formulario de solicitud a través del método HTTP POST, pero no puede formar datos. Por lo tanto, la declaración no se puede utilizar si request.POST para determinar si se debe utilizar el método HTTP POST, así que debería usar si request.method == "POST" (ver tabla de atributos de este método).

Nota: POST no incluye la información de carga de archivos. Ver archivos de propiedades.

SOLICITUD

Para mayor comodidad, esta propiedad es una colección de POST y GET atributo, pero no particularidad, comprobando primero enviar la propiedad, entonces look consigue atributo. de $ _REQUEST referencia PHP.

Por ejemplo, si usted consigue = { "name": "John"} y POST = { "edad": '34'}, a continuación, solicitar [ "nombre"] valor es "John", [ "edad"] el valor de la solicitud se "34."

Se recomienda encarecidamente el uso de GET y POST, porque estos dos atributos de una manera más explícita, por escrito el código sea más fácil de entender.

GALLETAS

Todas las cookies contienen diccionario estándar de Python objeto. Las claves y los valores son cadenas. Véase el Capítulo 12, hay una explicación más detallada acerca de las cookies.

ARCHIVOS

Diccionario-como objeto que contiene todos los archivos subidos. . Archivos cada una de clave es <input type = nombre de "archivo" = "" /> valor del atributo nombre de ficheros de etiquetas cada valor es también una norma objeto de diccionario de Python que contiene los siguientes tres teclas:

  • Nombre del archivo: Sube un nombre de archivo con una representación de cadena de Python
  • tipo de contenido del archivo cargado: tipo de contenido
  • El contenido original del archivo subido: contenido

Nota: Sólo el método de la petición es POST, y la página de solicitud <form> contiene ENCTYPE = "multipart / form-data" atributo de archivos sólo tienen datos. De lo contrario, los archivos es un diccionario vacío.

META

Diccionario que contiene todas las cabeceras HTTP disponibles. Por ejemplo:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: cadena de búsqueda original sin resolver
  • Dirección IP del cliente: REMOTE_ADDR
  • REMOTE_HOST: nombre del sistema cliente
  • NOMBRE_SERVIDOR: Nombre de host del servidor
  • SERVER_PORT: puerto del servidor

META estas cabeceras prefijo HTTP_ más clave, por ejemplo:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP información de encabezado de host enviado por el cliente
  • HTTP_REFERER: página de referencia
  • HTTP_USER_AGENT: cadena de agente de usuario del cliente
  • HTTP_X_BENDER: X-Bender cabecera

usuario

Django.contrib.auth.models.User es un objeto que representa al usuario actualmente conectado.

Si tiene acceso al usuario actualmente no está conectado, el usuario será inicializado instancia de django.contrib.auth.models.AnonymousUser.

Puede ser identificado por el método is_authenticated del usuario () de un usuario se registra:

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

Django activa sólo cuando el AuthenticationMiddleware La propiedad está disponible

sesión

La única propiedad de escritura que representa la sesión actual del objeto de diccionario. Django activa sólo cuando la sesión apoyó la propiedad está disponible. Véase el Capítulo 12.

raw_post_data

los datos HTTP POST primas, no se analizan. Ser útil cuando se hace avanzar el tratamiento.

Solicitud objeto también tiene algunos métodos útiles:

camino descripción
__getitem __ (clave) Devuelve las llaves GET / POST, en primer lugar tomar POST, después de tomar GET. Si la clave no existe KeyError tiro.
Esto es lo que podemos usar la sintaxis de diccionario para acceder objeto HttpRequest.
Por ejemplo, solicitar [ "foo"] es equivalente a la primera request.POST [ "foo"] y luego request.GET [ "foo"] operación.
has_key () Compruebe request.GET o parámetro request.POST especifica si se incluye la tecla.
get_full_path () petición de ruta de retorno contiene una cadena de consulta. Por ejemplo, "/ música / bandas / the_beatles /? Imprimir = true"
is_secure () Si la solicitud es seguro, devolver True, es decir, la luz emitida es HTTPS.

objetos QueryDict

En HttpRequest objeto, GET y POST de atributos son instancias de clases django.http.QueryDict.

QueryDict similares clase diccionario personalizado para manejar el caso de multi-valor correspondiente a un enlace sencillo.

QueryDict poner en práctica todos los métodos estándar del diccionario. El método también incluye específica:

camino descripción

__getitem__

Estándar proceso de diccionario es un poco diferente, es decir, si el número correspondiente de Clave Valor, __ __ GetItem () devuelve el último valor.

__setitem__

Ajustando el parámetro especifica el valor de una lista de claves (una lista de Python). Nota: Sólo se puede llamar (copia es a través de la copia () genera un objeto QueryDict) en un objeto QueryDict mutable.

get ()

Si la tecla correspondiente a la pluralidad de valor, get () devuelve el último valor.

update ()

Los parámetros se pueden QueryDict, puede ser un diccionario estándar. Diverso método de actualización de diccionarios estándar y el método de añadir los elementos del diccionario, en lugar de reemplazarlos:

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

(artículos)

Hay los elementos del diccionario estándar () método es un poco diferente, el método utiliza un solo valor __ __getitem lógica ():

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

>>> q.items()

[('a', '3')]

(valores)

Los valores del diccionario estándar () método es un poco diferente, el método utiliza un solo valor __getitem __ lógica ():

Además, QueryDict hay algunos métodos, la siguiente tabla:

camino descripción

copy ()

Devuelve una copia del objeto, la implementación interna en Python estándar copy.deepcopy biblioteca (). Esta copia es mutable (cambiante) - es decir, se puede cambiar el valor de la copia.

GetList (clave)

Todos los parámetros y valores de la clave correspondiente regresan, como una lista de Python devuelto. Si no existe la clave, devuelve una lista vacía. Está garantizado para devolver una lista de algún tipo ..

setlist (clave, List_)

Ajuste del valor de List_ clave (a diferencia de __setitem __ ()).

appendlist (clave, elemento)

Añadir el artículo a la llave y la lista interna asociada.

setlistdefault (clave, lista)

Y setdefault un poco diferente, se lista en lugar de un único valor como argumento acepta.

listas ()

Y los elementos () es un poco diferente, devolverá todos los valores clave, como una lista, por ejemplo:

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

>>> q.lists()

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

urlencode ()

Devuelve una cadena con formato para realizar el formato de cadena de consulta (por ejemplo, "a = 2 y b = 3 & b = 5").