Latest web development tutorials

Джанго формы

HTML формы являются классический способ интерактивный веб-сайт. В этой главе объясняется, как обращаться с данными Django форм, представленных пользователем.


запрос HTTP

HTTP протокол "Запрос - ответ" способ. Когда клиент отправляет запрос, вы можете запросить дополнительные данные. Запрос разрешения сервера, вы можете получить данные от клиента, а также для предоставления конкретных услуг на основе URL.

метод GET

Мы создали файл search.py ​​до начала реализации проекта, для получения запроса пользователя:

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

Добавить search_form.html шаблон формы в каталоге шаблона:

<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 правило изменяется следующим образом:

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

Адрес доступа: HTTP: //192.168.45.3: 8000 / Поиск-формы / и поиска, результаты выглядят следующим образом:

метод POST

Выше мы использовали метод GET. Просмотр дисплея и функции обработки запроса на два лечения.

Чаще POST метод для отправки данных. Мы используем следующий этот метод, с URL и обработчики, показан также вид и обработать запрос.

Мы создали post.html в 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>

В конце шаблона, мы добавили RLT метку-заполнитель для результатов таблицы.

Существует также таблица {%}% csrf_token тег позже. CSRF расшифровывается как Cross Site Request Forgery. Это обеспечивается Джанго предотвратить подделку подавать заявки. Метод POST для отправки формы, вы должны иметь этикетку.

Новый search2.py файл в каталоге HelloWorld и использовать функцию search_post для обработки 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 правило изменяется следующим образом:

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 Доступ Результаты следующим образом:

После завершения приведенных выше примеров, наша структура каталогов:

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

Объект запроса

Каждая функция зрения первый аргумент является объектом HttpRequest, чуть ниже функции приветствия ():

from django.http import HttpResponse

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

HttpRequest объект содержит некоторую информацию о текущем URL запроса:

свойство

описание

путь

Полный путь к запрашиваемой странице, не включая доменное имя - например, "/ привет /".

метод

Метод Строка HTTP используется в представлении запроса. Она представляет все заглавные буквы. Например:

если request.method == 'GET':
do_something ()
Элиф request.method == 'Post':
do_something_else ()

GET

Он содержит все HTTP GET параметры словаря-подобный объект. См QueryDict документацию.

POST

Он содержит все параметры HTTP POST словарь-подобный объект. См QueryDict документацию.

Запрос POST Ситуация Сервер получает пустой также возможно. Другими словами, форма форма для отправки запроса с помощью метода HTTP POST, но не может сформировать данные. Таким образом, данное утверждение не может быть использована, если request.POST, чтобы определить, следует ли использовать метод HTTP POST, вы должны использовать, если request.method == "POST" (см этот атрибут таблицы методов).

Примечание: POST не содержит информацию файлов загрузки. См свойствах файлов.

ЗАПРОС

Для удобства, это свойство представляет собой набор POST и GET атрибут, но есть особенность, проверка POST первое свойство, а затем посмотреть GET атрибут. Справочник РНР $ _REQUEST.

Например, если вы GET = { "имя": "John"} и POST = { "возраст": '34'}, то запрос [ "название"] значение "джон", [ "возраст"] значение запроса является "34."

Настоятельно рекомендуется использовать GET и POST, так как эти два атрибута более явным, написано проще код, чтобы понять.

ПЕЧЕНЬЕ

Все куки содержат стандартный Python объект словаря. Ключи и значения являются строками. Обратитесь к Главе 12, есть более подробное объяснение о печенье.

ФАЙЛЫ

Словарь-подобный объект, содержащий все загруженные файлы. . ФАЙЛЫ Каждая клавиша <тип = имя входного "Файл" = "" /> Значение атрибута имя тега ПОДАЕТ каждое значение также стандартный словарь Python объект, который содержит следующие три клавиши:

  • Имя файла: Загрузить имя файла с строковым представлением Python
  • Тип содержимого загруженного файла: Content-Type
  • Оригинальное содержание загруженного файла: содержание

Примечание: Только метод запроса POST, и запрос страницы <форма> имеет ENCTYPE = "многокомпонентные / form-данные" атрибут только файлы имеют данные. В противном случае, файлов пустой словарь.

META

Содержит все доступные словарь HTTP-заголовки. Например:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: нерешенной исходная строка запроса
  • REMOTE_ADDR: IP-адрес клиента
  • REMOTE_HOST: клиент имя хоста
  • SERVER_NAME: Сервер Имя хоста
  • SERVER_PORT: порт сервера

META эти заголовки приставкой HTTP_ наиболее Key, например:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP информацию заголовка узла, отправленный клиентом
  • HTTP_REFERER: ссылающейся страницы
  • HTTP_USER_AGENT: строка агента пользователя клиента
  • HTTP_X_BENDER: X-Bender заголовка

пользователь

Django.contrib.auth.models.User является объектом, который представляет пользователя, вошедшего в систему.

Если доступ пользователь в настоящее время не вошли в систему, пользователь должен будет инициализировать экземпляр django.contrib.auth.models.AnonymousUser.

Вы можете быть идентифицированы с помощью метода is_authenticated пользователя () пользователя регистрируется:

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

Джанго активируется только тогда, когда AuthenticationMiddleware Свойство доступно

сессия

Только записываемый свойство, которое представляет текущую сессию объекта словаря. Джанго активируется только тогда, когда сеанс поддерживается свойство доступно. Обратитесь к Главе 12.

raw_post_data

Исходные данные HTTP POST, а не разобрано. Будьте полезны при доочистке.

Запрос объекта также имеет некоторые полезные методы:

способ описание
__getitem __ (ключ) Возвращает ключи GET / POST, сначала принять POST, после приема GET. Если ключ не существует броска KeyError.
Это то, что мы можем использовать словарь синтаксис для доступа HttpRequest объект.
Например, запрос [ "Foo"] эквивалентно первому request.POST [ "Foo"], то request.GET [ "Foo"] операции.
has_key () Проверьте request.GET или параметр request.POST указывает, следует ли включать ключ.
get_full_path () Возвращенный запрос путь содержит строку запроса. Например, "/ музыка / группы / the_beatles /? Печать = истина"
is_secure () Если запрос является безопасным, возвращает истину, то есть свет, излучаемый является HTTPS запросы.

объекты QueryDict

В HttpRequest объект, GET и POST атрибуты являются экземплярами класса django.http.QueryDict.

QueryDict подобный пользовательский словарь класс для обработки случай многозначного соответствующей одинарной связью.

QueryDict реализовать все стандартные методы словаря. Способ также включает в себя конкретные:

способ описание

__getitem__

Стандартный словарь процесс немного отличается, то есть, если соответствующее число значение ключа, __ GetItem __ () возвращает последнее значение.

__setitem__

Установка параметра определяет значение списка ключа (список Python). Примечание: Это можно назвать только (копия через копии () генерируется объект QueryDict) на изменяемый объект QueryDict.

получить ()

Если ключ, соответствующий множеству значения, получаем () возвращает последнее значение.

обновление ()

Параметры могут быть QueryDict, это может быть стандартный словарь. Различные стандартный метод словаря обновления и метод добавления словаря элементов, а не заменять их:

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

(пункты)

Есть стандартные словарные статьи () метод немного отличается, метод использует однозначную логики __getitem __ ():

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

>>> q.items()

[('a', '3')]

(значения)

Стандартные значения словаря () метод немного отличается, метод использует однозначную логики __getitem __ ():

Кроме того, QueryDict есть некоторые методы, в следующей таблице:

способ описание

копия ()

Возвращает копию объекта, внутреннюю реализацию в Python стандартной библиотеки copy.deepcopy (). Эта копия является изменяемым (сменная) - то есть, вы можете изменить значение копии.

GetList (ключ)

Все параметры и возвращать значения соответствующего ключа, так как список Python вернулся. Если ключ не существует, то он возвращает пустой список. Это гарантированно возвращает список какой-то ..

сетлист (ключ, list_)

Установите значение ключа list_ (в отличие от __setitem __ ()).

appendlist (ключ, пункт)

Добавьте элемент к ключу и связанного с ним внутреннего списка.

setlistdefault (ключ, список)

И SetDefault немного по-другому, она принимает список, а не одно значение в качестве аргумента.

(списки)

А предметы () немного отличается, он будет возвращать все ключевые ценности, как список, например:

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

>>> q.lists()

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

UrlEncode ()

Возвращает строку, отформатированную для выполнения формат строки запроса (например, "а = 2 & Ъ = 3 & Ь = 5").