Наше первое представление «Hello world» было достаточно информативным для демонстрации основ того, как работает Django, но это не был пример настоящей динамической страницы, потому что содержимое страницы всегда было одно и то же. Каждый раз, когда вы обращаетсь к
/hello/
— вы видите одну и ту же статическую страницу HTML.
Для нашего следующего представления — давайте создадим нечто более динамическое — страницу, которая будет отображать текущее время и дату. Это простой шаг, потому что тут не используется база данных или какой-либо ввод данных от пользователя — а просто вывод времени вашего сервера. Это лишь ненамного сложнее, чем «Hello world«, но мы сможем продемонстрировать несколько новых понятий.
Это представление должно выполнять два действия: вычислить текущие время и дату, и вернуть HttpResponse
, который будет содержать эти данные. Если вы знакомы с Python 🙂 — вы должны знать, что в нём есть модуль datetime
для вычисления даты. Вот как он используется:
>>> import datetime >>> now = datetime.datetime.now() >>> now datetime.datetime(2015, 2, 2, 23, 1, 13, 162098) >>> print now 2015-02-02 23:01:13.162098
Это было очень просто, и не имеет ничего общего с Django — это просто код на Python.
Что бы написать Django-представление, которое будет выводить дату и время, нам надо использовать выражение datetime.datetime.now()
в этом представлении и вернуть HttpResponse
. Вот как это может выглядеть:
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
Как и в случае с представлением функции hello
— нам надо поместить этот код в файл views.py
. Вот как будет выглядеть весь файл целиком:
from django.http import HttpResponse import datetime def hello(request): return HttpResponse("Hello world") def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
(далее мы не будем отображать код из предыдущих примеров в новых примерах кода, кроме тех случаев, когда это необходимо — вы должны понимать из контекста, какая часть кода новая, а какая — старая)
Давайте пройдёмся по изменениям, которые мы сделали в файле views.py
, что бы добавить новое представление current_datetime
:
- мы добавили импорт модуля
datetime
, что бы иметь возможность вычислять дату; - новая функция
current_datetime
вычисляет текущие время и дату как объектdatetime.datetime
и сохраняет значеиние в локальную переменнуюnow
; - вторая страка кода внутри представления создаёт HTML-ответ, используя форматирование строк. Знак
%s
в строке является заполнителем, а знак%
после строки означает «Заменить%s
в предыдущей строке значением из переменнойnow
«. Переменнаяnow
технически является объектомdatetime.datetime
, а не строкой, но%s
конвертирует её в строковое представление вида «2015-02-02 23:01:13.162098«. В результате мы получим HTML-строку, такую как «<html><body>It is now 2015-02-02 23:01:13.162098.</body></html>» (да, наш код HTML не совсем корректен, но мы стараемся держать пример простым и коротким); - в конце-концов — представление возвращает объект
HttpResponse
, который содержит сгенерированный ответ, точно так же, как и в функцииhello
.
После добавления этого кода в файл views.py
, давайте добавим URLpattern
в файл urls.py
, что бы сообщить Django какой URL будет обрабатывать это представление. Например, URL вида /time/
будет вполне уместен:
from django.conf.urls.defaults import patterns, include, url from example.views import hello, current_datetime urlpatterns = patterns('', url(r'^hello/$', hello), url(r'^time/$', current_datetime), )
Мы сделали два изменения тут. Во-первых — мы импортировали функцию current_datetime
. Во-вторых, самое важное, мы добавили новый URLpattern
, связывающийс URL /time/
с новым представлением.
С написанным представлением, и обновлённым URLconf
, запустите сервер и откройте страницу http://127.0.0.1:8000/time/ в браузере. Вы должны увидеть текущие время и дату.
Часовой пояс Django
В зависимости от вашего сервера, время в результате Django может отличаться от времени на сервере. Это происходит от того, что Django по-умолчанию использует часовой пояс America/Chicago
. Если вы живёте в другом часов поясе — измените настройки в файле settings.py
. В комментариях к параметру TIME_ZONE
вы можете найти ссылку на список всех временных зон (http://en.wikipedia.org/wiki/List_of_tz_zones_by_name)
Продолжение — в статье Django Book: URLconf и “слабые связи”.