Наше первое представление «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 и “слабые связи”.