Создание сайта на Python/Django: Views
В предыдущей части мы познакомились с Django Admin и разобрались как его активировать. Мы подключили модель Question и разобрали базовые функции редактирования. В будущих публикациях я еще вернусь к вопросу админ панели и расширения её функционала. Пока же начнем создавать первые Views (представления) для нашего сайта.
Views отвечают за обработку и передачу данных и могут реализовывать одну или несколько функций. Данные, как правило, передаются в специальный шаблон. Такой шаблон (Template) является частью интерфейса.
Примером Views может быть homepage (index) – главная страница с перечнем публикаций или, как в нашем приложении, перечнем вопросов. Отдельным View может быть details page (страница деталей) для каждого отдельного вопроса, где будут отображен перечень вариантов ответов и другие связанные данные. Так же необходимо реализовать отдельный view для страницы результатов (results page). Обработчик голосования, т.е. функция, которая сохраняет выбор пользователя, тоже помещается в отдельный View.
В Django представления views являются своеобразными доставщиками контента от модели к шаблону отображения. Реализуются простыми функциями и методами языка Python. Взаимодействие с View происходит путем анализа части адресной строки, после основного домена. Например: /archive/<year>/<month>/<day>/ . Настройка и взаимодействие между URL и Views происходит при помощи «URLconfs».
Создаем больше Views
Давайте добавим несколько View в наше приложение и заставим его выводить что-то в браузер.
# polls/views.py from django.http import HttpResponse def index(request): return HttpResponse("Привет. Вы на главной странице приложения Polls.") def detail(request, question_id): return HttpResponse("Вопрос под номером %s." % question_id) def results(request, question_id): response = "Ответы на вопрос под номером %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("Вы отвечаете на вопрос под номером %s." % question_id)
Чтобы эти Views работали, необходимо включить их в polls.urls используя метод path().
from django.urls import path from . import views urlpatterns = [ # ex: /polls/ path('', views.index, name='index'), # ex: /polls/2/ path('<int:question_id>/', views.detail, name='detail'), # ex: /polls/2/results/ path('<int:question_id>/results/', views.results, name='results'), # ex: /polls/2/vote/ path('<int:question_id>/vote/', views.vote, name='vote'), ]
Таким образом настраивается соответствие запросов из адресной строки браузера с конкретным обработчиком из views.py. Первый аргумент функции path() принимает шаблон запроса, согласно которому будет производится обработка и перенаправление на соответствующий view, который задан вторым аргументом. Третий аргумент не является обязательным, но его лучше указать. Позже разберемся почему.
Теперь, если вы запустите сервер и откроете браузер, то указав в строке запроса, например, “/polls/2/vote/” вы должны увидеть текст “Вы отвечаете на вопрос под номером 2.”
Обратите внимание на шаблоны запросов, которые содержат символы “<” и “>”. Это переменная часть запроса, которая обрабатывается согласно указанному между данными символами правилу. Там, например, <int:question_id> означает, что в запросе будет целое число int, которое необходимо присвоить переменной
question_id, которую необходимо передать в качестве аргумента в функцию view.
Пишем Views, которые будут делать что-то полезное
Пока для примера наши views выводят только небольшой текст, но не делают ничего полезного. Пора это исправить. Следующим этапом будем реализовывать базовый функционал для обработки и вывода вопросов, вариантов ответов, процесса голосования и просмотра результатов.