Создание браузера на django

Обновлено: 07.07.2024

В этом уроке мы расскажем о создании базового приложения для голосования.

Он будет состоять из двух частей:

  • Публичный сайт, который позволяет людям просматривать опросы и голосовать в них.
  • Сайт администратора, который позволяет добавлять, изменять и удалять опросы.

Мы предполагаем, что вы уже установили Django . Вы можете узнать, установлена ли Django и какая версия, выполнив в командной строке следующую команду (указывается префиксом $):

Это руководство написано для Django 3.2, которая поддерживает Python 3.6 и более поздние версии. Если версия Django не совпадает, вы можете обратиться к учебнику для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до последней версии. Если вы используете более старую версию Python, проверьте Какие версии Python можно использовать с Django? , чтобы найти совместимую версию Django.

Смотрите Как установить Django , чтобы узнать как удалить старые версии Django и установить последнюю версию.

Где получить помощь:

Если у вас возникли проблемы с прохождением этого руководства, перейдите в раздел часто задаваемых вопросов Получение справки .

Создание проекта¶

Если вы раньше Django не использовали, то необходимо позаботиться о начальной настройке. А именно, необходимо автоматически сгенерировать определенный код, который устанавливает Django project — набор настроек для конкретного экземпляра Django, включающий в себя конфигурацию базы данных, специфичные для Django опции специфичные настройки для приложения.

Выполните в терминале в командной строке cd : смену каталога на тот, в котором вы хотите хранить код проекта, затем запустите следующую команду:

Это создаст каталог mysite в текущем каталоге. Если этого не произошло, то смотрите Проблемы с запуском django-admin .

Не рекомендуется в качестве названия проекта названия встроенных компонентов Python или Django. Это значит, что следует избегать использования таких имен, как django (будет конфликт с самим фреймворком) или test (будет конфликтовать со стандартным пакетом Python).

Где этот код должен находится?

Если бэкграунд написан на простом старом PHP (без использования современных фреймворков), вы, вероятно, привыкли размещать код в корневом каталоге веб-сервера (например, /var/www ). С Джанго так лучше не делать. Не стоит помещать какой-либо Python код в корневой каталог веб-сервера, потому что существует риск, что он может стать доступным для просмотра. Это не очень хорошо для безопасности сервера.

Размещайте свой код в каком-либо каталоге вне корневого каталога сервера, например /home/mycode .

Давайте посмотрим на результат выполнения команды startproject :

Разберем, для чего нужны эти файлы и каталоги:

  • Внешний корневой каталог mysite/ — это контейнер для вашего проекта. Его имя не имеет значения для Джанго; Вы можете переименовать его на что угодно.
  • manage.py : утилита, позволяющая взаимодействовать с проектом различными способами. Вы можете прочитать все подробности о manage.py в django-admin и manage.py .
  • Внутренний каталог mysite/ это Python модуль вашего проекта. Его название вы будете использовать для импорта чего-либо из этого модуля (например, mysite.urls ).
  • mysite/__init__.py : пустой файл, который сообщает Python, что этот каталог должен рассматриваться как пакет Python’а. Если вы новичок в Python, прочитайте больше о пакетах в официальной документации Python.
  • mysite/settings.py : Конфигурация и настройки проекта Django. В Настройки Django рассказано все о том, как работают настройки.
  • mysite/urls.py : указание URL проекта на Django, можно сказать, что это «оглавление» вашего проекта. Прочитайте больше информации о URL в Диспетчер URL .
  • mysite/asgi.py : точка входа для ASGI-совместимых веб-серверов для обслуживания вашего проекта. Смотрите Как развертывать с помощью ASGI для получения более подробной информации.
  • mysite/wsgi.py : Точка входа для WSGI совместимых веб-серверов для работы с проектом. Смотрите Как развертывать с помощью WSGI для уточнения деталей работы.

Сервер разработки¶

Давайте проверим, работает ли ваш проект Django. Перейдите во внешний каталог mysite , если вы этого еще не сделали, и выполните следующие команды:

Вы увидите следующий вывод в командной строке:

Пока игнорируйте предупреждение о непримененных миграциях базы данных; мы разберемся с базой данных в ближайшее время.

Вы запустили сервер разработки Django: облегченный веб-сервер, написанный исключительно на Python. Мы включили его в Django, чтобы можно было быстро разрабатывать проект, не занимаясь настройкой рабочего сервера, такого как Apache, до тех пор, пока вы не будете готовы к работе.

Сейчас самое время отметить: не используйте этот сервер во всем, что напоминает производственную среду. Он предназначен только для использования при разработке. (Мы занимаемся созданием веб-фреймворков, а не веб-серверов.)

По умолчанию команда runserver запускает сервер разработки на внутреннем IP адресе с портом 8000.

Для смены порта передайте его аргументом в командной строке. Например, эта команда запускает сервер на порту 8080:

Для изменения IP адреса сервера, передайте его вместе с портом. Например, чтобы использовать все доступные публичные IP-адреса (что полезно, если вы работаете с Vagrant или хотите показать свою работу на других компьютерах в сети), используйте:

0 это сокращение для 0.0.0.0. Полная документация по серверу разработки находится в руководстве runserver .

Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезагружать сервер, чтобы изменения в коде вступили в силу. Однако некоторые действия, такие как добавление файлов, в эти условия не входят, поэтому вам придется перезапустить сервер в этих случаях.

Создание приложения Polls¶

Теперь, когда ваше окружение - «проект» - настроено, вы можете приступить к дальнейшей работе.

Каждое приложение, которое вы пишете в Django, состоит из пакета Python, который следует определенному соглашению. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, поэтому вы можете сосредоточиться на написании кода, а не на создании каталогов.

Проекты и приложения

В чем разница между проектом и приложением? Приложение - это веб-приложение, которое что-то делает, например, система Weblog, база данных публичных записей или небольшое приложение для опроса. Проект - это набор настроек и приложений для определенного сайта. Проект может содержать несколько приложений. Приложение может быть в нескольких проектах.

Создаём проект Django в виртуальном окружении Python

Создайте новую папку и перейдите в неё:

mkdir django-react && cd $_

Потом активируйте виртуальное окружение Python:

Примечание все следующие команды нужно выполнять из папки django-react и с активированным виртуальным окружением.

Установите зависимости Django и Django REST Framework:

pip install django djangorestframework

После установки создайте новый проект Django:

django-admin startproject django_react

Теперь сделаем простое API на Django для создания и хранения контактов.

Создаём приложение на Django

В каждом проекте Django может быть много приложений. Приложения можно делать переиспользуемыми: такими, что их можно добавить в менеджер пакетов Python и установить через него в другой проект, в котором нужно такое приложение.

4–5 декабря, Онлайн, Беcплатно

Для создания нового приложения Django используется команда:

django-admin startapp app_name

где app_name — название приложения.

В нашем случае команда будет выглядеть так:

django-admin startapp leads

Она создаст приложение leads в папке django-react . Теперь структура папок в проекте должна выглядеть так:

Теперь сделаем так, чтобы Django проект использовал новое приложение. Откройте файл django_react/settings.py и добавьте приложение в INSTALLED_APPS :

Создаём модель в базе данных с помощью Django

Модель — это объект, представляющий собой данные из таблицы. Почти каждый веб-фреймворк использует модели, и Django — не исключение.

Модель Django может иметь одно или больше полей. Каждое поле соответствует полю в таблице.

Мы собираемся хранить контакты, поэтому модель Lead может состоять из этих полей:

(Можно добавлять и другие поля, например телефон). Добавим ещё поле с временем создания модели, потому что по умолчанию Django этого не делает.

Откроем leads/models.py и опишем модель Lead :

Примечание изучите документацию Django о полях. Когда придумываете структуру модели, выбирайте самые подходящие для вашего случая поля.

Создадим миграции командой:

python manage.py makemigrations leads

и применим их к базе данных:

python manage.py migrate

Займёмся тестированием

Вы могли подумать «А как же тестирование?».

Мнение: разработка через тестирование — это тупо. Обсуждаем TDD

Существует масса туториалов по Django, начинающихся примерно так:

Не надо так. Нет никакого смысла ни в тестировании стандартной модели Django, ни в тестировании Django ORM. Что точно не нужно тестировать при создании приложения на Django:

  • встроенный код Django (модели, представления);
  • встроенные функции Python.

Не тестируйте то, что уже протестировано! Так что же тогда тестировать?

Добавили свой метод в модель Django — протестируйте его. Дополнили стандартное представление — протестируйте его. Но как узнать, что именно нужно протестировать?

Узнать это поможет библиотека coverage. Установите её:

pip install coverage

Теперь после каждого добавления или изменения кода запускайте coverage :

coverage run --source='.' manage.py test

и создавайте отчёт:

Вы увидите, что именно нужно протестировать. Если предпочитаете увидеть отчёт в командной строке, запустите команду:

Сериализаторы Django

Сериализация — это конвертация объекта Python в другой формат. После сериализации можно сохранить объект в файл или послать его через сеть.

Как оценить профессионализм программиста за 5 вопросов — отвечают эксперты

Почему сериализация необходима? Модель Django — это класс Python. Чтобы превратить её в данные в формате JSON, нужна сериализация.

Сериализаторы работают и в обратном направлении: они конвертируют JSON в объекты. Это позволяет:

Суммируя: сериализаторы в Django можно использовать для совершения операций с моделями Django через API.

Создайте новый файл leads/serializers.py . Сериализатор LeadSerializer содержит нашу модель и поля:

Созданный дочерний класс от класса serializers.ModelSerializer . ModelSerializer в Django похож на ModelForm . Он подходит, когда нужно, чтобы сериализатор соответствовал модели.

Создаём представления

Если вы раньше работали с другими фреймворками, то можете удивиться, что в Django нет контроллеров.

Веб-фреймворки для начинающих: простое объяснение с примерами

Django — это фреймворк MVT. MVT — это модель, представление и шаблон (Template). В Django есть много типов представлений: функции-представления, представления, основанные на классах, и обобщённые представления.

Используйте функции-представления только если изменение обобщенных представлений займет больше, чем написание представления заново.

Мы будем использовать обобщённые представления. Наше простое приложение будет:

  • возвращать выборку моделей;
  • создавать новые объекты в базе данных.

С помощью документации можно узнать, что есть представление для возвращения выборки и создания моделей: ListCreateAPIView . Это представление содержит queryset и serializer_class .

queryset — это выборка данных, которую приложение будет возвращать. В нашем случае — все модели Lead . serializer_class — класс сериализатора для модели.

Добавьте в файл django_react/views.py следующий код:

С помощью трёх строк кода мы создали представление для обработки GET и POST запросов.

Чего ещё не хватает? Маршрутизации URL. Другими словами, нам нужно соединить URL и представления.

Настраиваем маршрутизацию url

Нам нужно сделать так, чтобы GET и POST запросы к api/lead/ обрабатывались представлением LeadListCreate , которое будет возвращать и создавать модели.

Чтобы настроить маршрутизацию URL, отредактируйте файл django_react/urls.py , добавив туда url приложения:

Так мы указываем Django, что нужно использовать url, которые есть в приложения leads .

Теперь создайте файл leads/urls.py . В нём мы соединим представление LeadListCreate и url api/lead/ :

И наконец, включим rest_framework в INSTALLED_APPS . Откройте django_react/settings.py и добавьте приложение в INSTALLED_APPS :

Запустим сервер Django:

python manage.py runserver


Примечание в продакшене лучше отключить возможность просмотра API. Это можно сделать в конфигурации:

Соединяем Django и React

У многих разработчиков возникают вопросы по поводу того, как правильно соединить Django и React.

React: практики, которые помогут стать продвинутым разработчиком

Должен ли роутер React взять на себя маршрутизацию? Нужно ли монтировать компоненты React в каждом шаблоне Django?

Ответ зависит от случая.

Есть следующие способы создания проекта на Django и React (они похожи почти для любого веб-фреймворка):

  1. React в собственном приложении Django для фронтенда. Загружаем один HTML шаблон и даём React управление фронтендом (сложность: средняя).
  2. Django REST как отдельное API + React как отдельное SPA (сложность: высокая, нужна будет авторизация по JWT).
  3. Смешанный вариант: мини-приложения React в шаблонах Django (сложность: просто, но сложно будет поддерживать).

Если вы только начали работать с Django REST и React, избегайте варианта 2. Вместо этого выберите 1 (React в собственном приложении Django для фронтенда), если:

  • вы создаёте приложение, похожее на веб-сайт;
  • в интерфейсе будет много пользовательских действий, используется AJAX;
  • вас устраивает авторизация, основанная на сессиях;
  • вас не очень волнуют вопросы SEO;
  • вас устраивает роутер React.

Если будете держать React близко к Django, то будет проще с авторизацией. Можно будет использовать встроенную систему авторизации Django для регистрации и входа пользователей. Используйте старую добрую авторизацию с помощью сессий и не беспокойтесь о токенах и JWT.

Выберите вариант 3 (смешанный вариант: мини-приложения React в шаблонах Django), если:

  • на сайте не нужно использовать много JavaScript;
  • вам важно SEO и вы не можете использовать Node.js для рендеринга серверной части.

В данной статье мы будем использовать вариант 1.

Устанавливаем React и webpack

Создадим новое приложение Django для фронтенда:

django-admin startapp frontend

Вы увидите новую папку с названием frontend в вашей структуре папок:

Подготовим папки для хранения компонентов React:

mkdir -p ./frontend/src/components

Дальше установим React, webpack и babel. Перейдите в папку frontend и создайте окружение:

cd ./frontend && npm init -y

Установите webpack и webpack CLI:

npm i webpack webpack-cli --save-dev

Откройте package.json и запишите 2 скрипта для продакшна и для разработки:

Сохраните и закройте файл.

Установим babel, чтобы код был совместим со старыми браузерами, которые не поддерживают последние стандарты JavaScript:

npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev

npm i react react-dom --save-dev

Настроим Babel (по-прежнему находясь в папке frontend ):

Создадим файл webpack.config.js для настройки загрузчика babel:

Готовим приложение Django для фронтенда

Создадим представление в ./frontend/views.py :

Создадим шаблон в ./frontend/templates/frontend/index.html :

В шаблоне вызывается ./frontend/main.js — файл, который будет генерировать webpack, содержащий весь код на React.

Настроим маршрутизатор Django: включим туда url приложения frontend. Отредактируем файл ./project/urls.py :

Создадим файл ./frontend/urls.py :

Включим приложение фронтенда в список используемых приложений в файле ./project/settings.py :

Фронтенд на React

Сделаем простой компонент React, который будет отображать наши данные. Если ваша база данных пуста, то самое время наполнить приложение какими-нибудь данными.

Создадим файл ./frontend/src/components/App.js . В нём будет компонент React, запрашивающий и отображающий данные.

Примечание можно написать тот же компонент в виде функции с хуком useEffect .

Сохраните и закройте файл. Теперь создайте точку входа для webpack — файл ./frontend/src/index.js и импортируйте компонент:

import App from "./components/App" ;

Теперь можно протестировать результат. Запустите webpack:

Запустите сервер Django:

python manage.py runserver


Выглядит просто. И работает!

Заключение

В этом материале мы сделали простой проект на Django REST API и React. Мы научились:

  • создавать простое REST API на Django;
  • добавлять React в проект Django;
  • соединять Django REST API и React.

Если этот проект показался сложным, попробуйте другой туториал. В нём мы показали, как создать первое веб-приложение на Django.

В этом уроке мы расскажем о создании базового приложения для голосования.

Он будет состоять из двух частей:

  • Публичный сайт, который позволяет людям просматривать опросы и голосовать в них.
  • Сайт администратора, который позволяет добавлять, изменять и удалять опросы.

Мы предполагаем, что вы уже установили Django . Вы можете узнать, установлена ли Django и какая версия, выполнив в командной строке следующую команду (указывается префиксом $):

Это руководство написано для Django 3.1, которая поддерживает Python 3.6 и более поздние версии. Если версия Django не совпадает, вы можете обратиться к учебнику для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до последней версии. Если вы используете более старую версию Python, проверьте Какие версии Python можно использовать с Django? , чтобы найти совместимую версию Django.

Смотрите Как установить Django , чтобы узнать как удалить старые версии Django и установить последнюю версию.

Где получить помощь:

Если у вас возникли проблемы с просмотром этого учебника, перейдите в раздел Получение справки FAQ.

Создание проекта¶

Если вы раньше Django не использовали, то необходимо позаботиться о начальной настройке. А именно, необходимо автоматически сгенерировать определенный код, который устанавливает Django project — набор настроек для конкретного экземпляра Django, включающий в себя конфигурацию базы данных, специфичные для Django опции специфичные настройки для приложения.

Выполните в терминале в командной строке cd : смену каталога на тот, в котором вы хотите хранить код проекта, затем запустите следующую команду:

Это создаст каталог mysite в текущем каталоге. Если этого не произошло, то смотрите Проблемы с запуском django-admin .

Не рекомендуется в качестве названия проекта названия встроенных компонентов Python или Django. Это значит, что следует избегать использования таких имен, как django (будет конфликт с самим фреймворком) или test (будет конфликтовать со стандартным пакетом Python).

Где этот код должен находится?

Если бэкграунд написан на простом старом PHP (без использования современных фреймворков), вы, вероятно, привыкли размещать код в корневом каталоге веб-сервера (например, /var/www ). С Джанго так лучше не делать. Не стоит помещать какой-либо Python код в корневой каталог веб-сервера, потому что существует риск, что он может стать доступным для просмотра. Это не очень хорошо для безопасности сервера.

Размещайте свой код в каком-либо каталоге вне корневого каталога сервера, например /home/mycode .

Давайте посмотрим на результат выполнения команды startproject :

Разберем, для чего нужны эти файлы и каталоги:

  • Внешний корневой каталог mysite/ — это контейнер для вашего проекта. Его имя не имеет значения для Джанго; Вы можете переименовать его на что угодно.
  • manage.py : утилита, позволяющая взаимодействовать с проектом различными способами. Вы можете прочитать все подробности о manage.py в django-admin и manage.py .
  • Внутренний каталог mysite/ это Python модуль вашего проекта. Его название вы будете использовать для импорта чего-либо из этого модуля (например, mysite.urls ).
  • mysite/__init__.py : пустой файл, который сообщает Python, что этот каталог должен рассматриваться как пакет Python’а. Если вы новичок в Python, прочитайте больше о пакетах в официальной документации Python.
  • mysite/settings.py : Конфигурация и настройки проекта Django. В Настройки Django рассказано все о том, как работают настройки.
  • mysite/urls.py : указание URL проекта на Django, можно сказать, что это «оглавление» вашего проекта. Прочитайте больше информации о URL в Диспетчер URL .
  • mysite/asgi.py : точка входа для ASGI-совместимых веб-серверов для обслуживания вашего проекта. Смотрите /howto/deploy/asgi/index для более подробной информации, а также документацию по ASGI .
  • mysite/wsgi.py : Точка входа для WSGI совместимых веб-серверов для работы с проектом. Смотрите Как развертывать с помощью WSGI для уточнения деталей работы.

Сервер разработки¶

Давайте проверим, работает ли ваш проект Django. Перейдите во внешний каталог mysite , если вы этого еще не сделали, и выполните следующие команды:

Вы увидите следующий вывод в командной строке:

Пока игнорируйте предупреждение о непримененных миграциях базы данных; мы разберемся с базой данных в ближайшее время.

Вы запустили сервер разработки Django: облегченный веб-сервер, написанный исключительно на Python. Мы включили его в Django, чтобы можно было быстро разрабатывать проект, не занимаясь настройкой рабочего сервера, такого как Apache, до тех пор, пока вы не будете готовы к работе.

Сейчас самое время отметить: не используйте этот сервер во всем, что напоминает производственную среду. Он предназначен только для использования при разработке. (Мы занимаемся созданием веб-фреймворков, а не веб-серверов.)

По умолчанию команда runserver запускает сервер разработки на внутреннем IP адресе с портом 8000.

Для смены порта передайте его аргументом в командной строке. Например, эта команда запускает сервер на порту 8080:

Для изменения IP адреса сервера, передайте его вместе с портом. Например, чтобы использовать все доступные публичные IP-адреса (что полезно, если вы работаете с Vagrant или хотите показать свою работу на других компьютерах в сети), используйте:

0 это сокращение для 0.0.0.0. Полная документация по серверу разработки находится в руководстве runserver .

Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезагружать сервер, чтобы изменения в коде вступили в силу. Однако некоторые действия, такие как добавление файлов, в эти условия не входят, поэтому вам придется перезапустить сервер в этих случаях.

Создание приложения Polls¶

Теперь, когда ваше окружение - «проект» - настроено, вы можете приступить к дальнейшей работе.

Каждое приложение, которое вы пишете в Django, состоит из пакета Python, который следует определенному соглашению. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, поэтому вы можете сосредоточиться на написании кода, а не на создании каталогов.

Проекты и приложения

В чем разница между проектом и приложением? Приложение - это веб-приложение, которое что-то делает, например, система Weblog, база данных публичных записей или небольшое приложение для опроса. Проект - это набор настроек и приложений для определенного сайта. Проект может содержать несколько приложений. Приложение может быть в нескольких проектах.

Этот учебник начинается с момента, на которым мы остановились в Tutorial 1 остановился. Здесь мы настроим базу данных, создадим первую модель и быстро познакомимся с автоматически генерируемым сайтом администрирования Django.

Где получить помощь:

Если у вас возникли проблемы с прохождением этого руководства, перейдите в раздел часто задаваемых вопросов Получение справки .

Настройка базы данных¶

Теперь откройте mysite/settings.py . Это обычный модуль Python с переменными уровня модуля, представляющими настройки Django.

По умолчанию в конфигурации используется SQLite. Если вы новичок в базах данных или просто хотите попробовать Django, это самый простой выбор. SQLite включен в Python, поэтому вам не нужно устанавливать что-либо еще для поддержки вашей базы данных. Однако при запуске первого реального проекта вы можете использовать более масштабируемую базу данных, такую как PostgreSQL, чтобы избежать проблем с переключением баз данных в будущем.

Если вы хотите использовать другую базу данных, установите соответствующую bindings и измените следующие ключи в параметре DATABASES 'default' , чтобы он соответствовал настройкам соединения с вашей базой данных:

    - 'django.db.backends.sqlite3' , 'django.db.backends.postgresql' , 'django.db.backends.mysql' , или 'django.db.backends.oracle' . Другие бэкенды также доступны . - название вашей базы данных. Если вы используете SQLite, база данных будет файлом на вашем компьютере; в этом случае NAME должен быть полным абсолютным путем, включая имя файла этого файла. Значение по умолчанию BASE_DIR/'db.sqlite3' сохранит файл в каталоге вашего проекта.

Если вы не используете SQLite в качестве базы данных, необходимо добавить дополнительные настройки, такие как USER , PASSWORD и HOST . Для получения дополнительной информации смотрите справочную документацию для DATABASES .

Для баз данных, отличных от SQLite

Если вы используете базу данных отличную от SQLite, убедитесь, что создали базу данных к этому моменту. Это делается с помощью команды « CREATE DATABASE database_name; » в интерактивной консоли базы данных.

Также убедитесь, что пользователь базы данных, указанный в mysite/settings.py , имеет права на создание базы данных. Это позволяет автоматически создавать test database , которая понадобится в следующем уроке.

Если вы используете SQLite, вам не нужно ничего создавать заранее - файл базы данных будет создан автоматически, когда в этом возникнет необходимость.

Во время редактирования mysite/settings.py , установите TIME_ZONE в свой часовой пояс.

Также обратите внимание на параметр INSTALLED_APPS в верхней части файла. Он содержит имена всех приложений Django, которые активированы в этом экземпляре проекта Django. Приложения могут использоваться в нескольких проектах, и вы можете упаковывать и распространять их для использования другими разработчиками в своих проектах.

По умолчанию INSTALLED_APPS содержит следующие приложения, все из которых поставляются с Django:

Эти приложения включены по умолчанию для удобства для большинства базовых задач.

Некоторые из этих приложений используют хотя бы одну таблицу базы данных, поэтому нам необходимо создать таблицы в базе данных, прежде чем мы сможем их использовать. Для этого выполните следующую команду:

Как мы уже говорили выше, стандартные приложения включены для общего случая, но они нужны не всем. Если вам не нужны какие-либо или все из них, не стесняйтесь комментировать или удалять соответствующие строки из INSTALLED_APPS перед запуском migrate . Команда migrate запускает миграцию только для приложений в INSTALLED_APPS .

Создание моделей¶

Теперь мы определим ваши модели – по сути, структуру вашей базы данных с дополнительными метаданными.

Модель – это единственный, достоверный источник правды о ваших данных. Он содержит основные поля и поведение данных, которые вы храните. Django придерживается Принцип DRY . Цель состоит в том, чтобы определить вашу модель данных в одном месте и автоматически извлекать из нее информацию.

Это включает в себя миграции - в отличие от Ruby On Rails, например, миграции полностью происходят из файла ваших моделей и, по сути, представляют собой историю, которую Django может пролистать, чтобы обновить схему вашей базы данных, чтобы она соответствовала вашим текущим моделям.

В нашем приложении для опроса мы создадим две модели: Question и Choice . Question содержит вопрос и дату публикации. Choice содержит два поля: текст выбора и подсчет голосов. Каждый Choice связан с Question .

Эти понятия представлены классами Python. Отредактируйте файл polls/models.py так, чтобы он выглядел следующим образом:

Здесь каждая модель представлена классом, который подкласс django.db.models.Model . Каждая модель имеет несколько переменных класса, каждая из которых представляет поле базы данных в модели.

Каждое поле представлено экземпляром класса Field - например, CharField для символьных полей и DateTimeField для datetime. Это сообщает Django, какой тип данных содержит каждое поле.

Имя каждого экземпляра Field (например, question_text или pub_date ) – это имя поля в машинно-удобном формате. Вы будете использовать это значение в своем коде Python, а ваша база данных будет использовать его в качестве имени столбца.

Вы можете использовать необязательный первый позиционный аргумент для Field для обозначения понятного человеку названия. Это используется в паре интроспективных частей Django, и дублируется как документация. Если это поле не указано, Django будет использовать машиночитаемое имя. В этом примере мы определили только удобочитаемое имя для Question.pub_date . Для всех других полей в этой модели, машиночитаемое имя поля будет достаточно в качестве его удобочитаемого имени.

Некоторые классы Field имеют обязательные аргументы. CharField , например, требует, чтобы вы передали ему аргумент max_length . Это используется не только в схеме базы данных, но и при проверке, как мы скоро увидим.

Field также может иметь различные необязательные аргументы. В этом случае мы установили для default значение voice в 0.

Наконец, обратите внимание, что связь определена с использованием ForeignKey . Это говорит Django, что каждый Choice связан с одним Question . Django поддерживает все общие отношения базы данных: многие-к-одному, многие-ко-многим и один-к-одному.

Активация моделей¶

Этот небольшой кусочек кода модели дает Django много информации. С его помощью Django может:

  • Создать схему базы данных (оператор CREATE TABLE ) для этого приложения.
  • Создать API доступа к базе данных Python для доступа к объектам Question и Choice .

Но сначала нам нужно сообщить нашему проекту, что установлено приложение polls .

Приложения Django являются «подключаемыми»: вы можете использовать приложение в нескольких проектах и распространять приложения, потому что они не должны быть привязаны к конкретной установке Django.

Чтобы включить приложение в наш проект, нужно добавить ссылку на его класс конфигурации в настройке INSTALLED_APPS . Класс PlayersConfig находится в файле polls/apps.py , поэтому его путь - 'polls.apps.PollsConfig' . Отредактируйте файл mysite/settings.py и добавьте этот путь в параметр INSTALLED_APPS . Это будет выглядеть так:

Теперь Django знает, как подключить приложение polls . Давайте запустим другую команду:

Вы должны увидеть что-то похожее на следующее:

Запустив makemigrations , вы сообщаете Django, что внесли некоторые изменения в свои модели (в данном случае вы сделали новые) и хотите, чтобы изменения были сохранены как * миграция*.

Миграции - это то, как Django хранит изменения в ваших моделях (и, следовательно, в вашей схеме базы данных) - это файлы на диске. Вы можете прочитать миграцию для своей новой модели, если хотите. Это файл polls/migrations/0001_initial.py . Не волнуйтесь, от вас не ожидают, что вы будете читать их каждый раз, когда Django их создает, но они предназначены для редактирования человеком, если вы хотите вручную что-то изменить.

Есть команда, которая будет запускать миграции для вас и автоматически управлять схемой вашей базы данных - она называется migrate , и мы вскоре к ней подойдем - но сначала давайте посмотрим, какой SQL будет выполняться этой миграцией. Команда sqlmigrate принимает имена миграции и возвращает их SQL:

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

Обратите внимание на следующее:

  • Точный вывод будет зависеть от базы данных, которую вы используете. Пример выше создан для PostgreSQL.
  • Имена таблиц автоматически генерируются путем объединения названия приложения ( polls ) и названия модели в нижнем регистре - question и choice . (Вы можете переопределить это поведение.)
  • Первичные ключи (идентификаторы) добавляются автоматически. (Вы можете переопределить это тоже.)
  • По соглашению, Django добавляет "_id" к имени поля внешнего ключа. (Да, вы также можете переопределить это.)
  • Отношение внешнего ключа становится явным с помощью ограничения FOREIGN KEY . Не беспокойтесь о деталях DEFERRABLE ; оно говорит PostgreSQL не применять внешний ключ до конца транзакции.
  • Он адаптирован к используемой вами базе данных, поэтому обрабатываются специфичные для базы данных типы полей, такие как auto_increment (MySQL), serial (PostgreSQL) или integer primary key autoincrement (SQLite) для вас автоматически. То же самое касается экранирования имен полей - например, использование двойных или одинарных кавычек.
  • Команда sqlmigrate на самом деле не запускает миграцию в вашей базе данных - она просто выводит ее на экран, чтобы вы могли увидеть, какой SQL Django считает необходимым. Это полезно для проверки того, что собирается делать Django, или если у вас есть администраторы баз данных, которым требуются сценарии SQL для изменений.

Если вам интересно, вы также можете запустить python manage.py check . Эта команда проверяет любые проблемы в вашем проекте, не делая миграции или касаясь базы данных.

Теперь запустите migrate еще раз, чтобы создать эти таблицы моделей в вашей базе данных:

Команда migrate берет все миграции, которые не были применены (Django отслеживает, какие из них применены, используя специальную таблицу в вашей базе данных под названием django_migrations ) и запускает их в вашей базе данных - по сути, синхронизируя изменения, которые вы внесли в свои модели с помощью схемы в базе данных.

Миграции очень мощны и позволяют вам со временем менять свои модели по мере разработки проекта, без необходимости удалять вашу базу данных или таблицы и создавать новые - она специализируется на обновлении вашей базы данных в реальном времени, без потери данных. Мы рассмотрим их более подробно в следующей части руководства, но сейчас вспомним трехэтапное руководство по внесению изменений в модель:

  • Изменение модели ( models.py ).
  • Запуск команды python manage.py makemigrations для создания миграций этих изменений
  • Выполнение команды python manage.py migrate для применения этих изменений в базе данных.

Причина того, что существуют отдельные команды для создания и применения миграций, заключается в том, что вы фиксируете миграции в своей системе контроля версий и отправляете их вместе с вашим приложением; они не только облегчают вашу разработку, они также могут использоваться другими разработчиками и в производстве.

Прочтите документацию django-admin для получения полной информации о том, что может сделать утилита manage.py .

Знакомство с API¶

Теперь давайте перейдем к интерактивной оболочке Python и поиграемся с API, предоставляемым Django. Чтобы вызвать оболочку Python, используйте эту команду:

Мы используем это вместо простого ввода «python», потому что manage.py устанавливает переменную среды DJANGO_SETTINGS_MODULE , которая дает Django путь импорта Python к вашему файлу mysite/settings.py .

Попав в оболочку, изучите API базы данных :

Подождите минуту. <Question: Question object (1)> не является полезным представлением этого объекта. Давайте исправим, отредактировав модель Question (в файле polls/models.py ) и добавив метод __str__() в оба Question и Choice`:

Важно добавить методы __str__() в ваши модели, не только для вашего удобства при работе с интерактивным приглашением, но и потому, что представления объектов используются во всех автоматически сгенерированных страниц админки Django.

Давайте также добавим пользовательский метод к этой модели:

Обратите внимание на добавление datetime и from django.utils import timezone для ссылки на стандартный модуль Python datetime и утилиты Django, связанные с часовыми поясами, в django.utils.timezone соответственно. Если вы не знакомы с обработкой часовых поясов в Python, вы можете узнать больше в поддержка часовых поясов .

Сохраните эти изменения и запустите новую интерактивную оболочку Python, снова запустив python manage.py shell :

Для получения дополнительной информации о связях в моделях смотрите Доступ к связанным объектам . Подробнее о том, как использовать двойные подчеркивания для поиска полей через API, смотрите Поиск по полям . Для получения полной информации об API базы данных, смотрите наш Справочник по API базы данных .

Административная часть Django¶

Создание сайтов администратора для ваших сотрудников или клиентов для добавления, изменения и удаления контента - это утомительная работа, которая не требует большого творческого подхода. По этой причине Django полностью автоматизирует создание интерфейсов администратора для моделей.

Django был написан в новостной среде с очень четким разделением между «издателями контента» и «публичным» сайтом. Менеджеры сайтов используют систему для добавления новостей, событий, спортивных результатов и т.п. И этот контент отображается на общедоступном сайте. Django решает проблему создания единого интерфейса для администраторов сайтов для редактирования контента.

Администраторская часть не предназначена для использования посетителями сайта. Это для менеджеров.

Создание пользователя с правами администратора¶

Сначала нам нужно создать пользователя, который сможет войти на сайт администратора. Запустите следующую команду:

Введите желаемое имя пользователя и нажмите ввод.

Вам будет предложено указать желаемый адрес электронной почты:

Последний шаг - ввести ваш пароль. Вам будет предложено ввести пароль дважды, второй раз в качестве подтверждения первого.

Запуск сервера разработки¶

Сайт администратора Django активирован по умолчанию. Давайте запустим сервер разработки и исследуем его.

Если сервер не работает, запустите его так:

Django admin login screen

Поскольку translation включен по умолчанию, если вы установите LANGUAGE_CODE , экран входа в систему будет отображаться на заданном языке (если у Django есть соответствующие переводы).

Теперь попробуйте войти в систему с учетной записью суперпользователя, которую вы создали на предыдущем шаге. Вы должны увидеть главную страницу админки Django:

Django admin index page

Вы должны увидеть несколько типов редактируемого контента: группы и пользователи. Они предоставляются django.contrib.auth , инфраструктурой аутентификации, поставляемой Django.

Добавление своего приложения в админку¶

Но где наше приложение для голосования? Оно не отображается на главной странице админки.

Осталось сделать еще одно дело: нужно сообщить админке, что у объектов Question есть интерфейс администратора. Для этого откройте файл polls/admin.py и отредактируйте его следующим образом:

Изучите функциональность админки¶

Теперь, когда мы зарегистрировали Question , Django знает, что он должен отображаться на главной странице:

Django admin index page, now with polls displayed

Нажмите «Questions». Теперь вы находитесь на странице «Список изменений» для вопросов. На этой странице отображаются все вопросы в базе данных, и вы можете выбрать один из них, чтобы изменить его. Там есть вопрос «What’s up?», который мы создали ранее:

Polls change list page

Нажмите «What’s up?» для его редактирования:

Editing form for question object

Что следует отметить здесь:

  • Форма автоматически генерируется из модели Question .
  • Различные типы полей модели ( DateTimeField , CharField ) соответствуют своему виджету ввода HTML. Каждый тип поля знает, как отобразить себя в админке Django.
  • Каждый DateTimeField получает ярлыки JavaScript. Даты получают ярлык «Сегодня» и всплывающее окно календаря, а время - ярлык «Сейчас» и удобное всплывающее окно, в котором перечислены часто вводимые времена.

В нижней части страницы вы найдете несколько опций:

  • Save - сохраняет изменения и возвращает на страницу списка изменений для этого типа объекта.
  • Сохранить и продолжить редактирование - сохраняет изменения и перезагружает страницу администратора для этого объекта.
  • Сохранить и добавить еще один - сохраняет изменения и загружает новую, пустую форму для этого типа объекта.
  • Удалить - отображает страницу подтверждения удаления.

Если значение «Date published» не соответствует времени, когда вы создали вопрос в Части 1 , это, вероятно, означает, что вы забыли установить правильное значение для настройки TIME_ZONE . Измените его, перезагрузите страницу и убедитесь, что отображается правильное значение.

Измените «Дата публикации», нажав на ярлыки «Сегодня» и «Сейчас». Затем нажмите «Сохранить и продолжить редактирование». Затем нажмите «История» в правом верхнем углу. Вы увидите страницу со списком всех изменений, внесенных в этот объект через администратора Django, с отметкой времени и именем пользователя, который внес изменение:

History page for question object

Если вы знакомы с API моделей и ознакомились с сайтом администратора, прочитайте часть 3 , чтобы узнать, как добавить больше отображений (функций) в наше приложение для опросов.

Читайте также: