Я пытаюсь следовать тому, что здесь объясняется: http://www.djangobook.com/en/2.0/chapter03/ (сбивающий с толку пример составляет около 4/5 пути вниз по странице).
Идея состоит в том, чтобы иметь URL, по которому можно сопоставить любой из /time/plus/1
, /time/plus/2
, /time/plus/3
и т. Д. - вплоть до /time/plus/99
. Книга говорит:
Как же тогда мы проектируем наше приложение для обработки произвольного часа?
Смещения? Ключ заключается в использовании подстановочных знаков URLpatterns. Как мы уже говорили
ранее URLpattern был регулярным выражением; следовательно, мы можем использовать
шаблон регулярного выражения \ d + для соответствия одной или нескольким цифрам:
Поскольку мы хотим остановиться на 99, книга предлагает использовать следующее:
urlpatterns = patterns('',
# ...
(r'^time/plus/\d{1,2}/$', hours_ahead),
# ...
)
Но теперь мы столкнулись с проблемой точного определения того, какому числу соответствует регулярное выражение, и использования его в наших вычислениях. Объяснение книги продолжается:
Теперь, когда мы определили подстановочный знак для URL, нам нужен способ
передача этих подстановочных данных в функцию представления, чтобы мы могли использовать
одиночная функция просмотра для любого произвольного смещения часов. Мы делаем это путем
поместив скобки вокруг данных в URLpattern, которые мы хотим
спасти. В нашем примере мы хотим сохранить любое число
введен в URL, поэтому давайте поставим круглые скобки вокруг \d{1,2}
, например
это:
(r'^time/plus/(\d{1,2})/$', hours_ahead),
Если вы знакомы с регулярными выражениями, вы будете чувствовать себя как дома
Вот; мы используем скобки для сбора данных из сопоставленного текста.
Хорошо, я понимаю, что данные собираются, но где они хранятся? Как Django узнает, что ему нужно передать захваченные данные в функцию hours_ahead
? Действительно, один комментатор на сайте книг даже задает следующий вопрос:
Из описания не понятно, как сохранить введенный номер
URL - поставив скобки вокруг d {1,2} - позволяет этому значению
передаваться как параметр в hours_ahead.
Не могли бы вы объяснить, как полученные данные с URL-адреса передаются в функцию hours_ahead?
Если вам интересно, вот функция из файла views.py:
from django.http import Http404, HttpResponse
import datetime
def hours_ahead(request, offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)