Шпаргалка по Python для Django
В Python очень много полезных функций, библиотек и других элементов, перечислить которые в одном материале очень сложно. Мы поделимся базовой шпаргалкой по Python, которая ориентирована на создание веб-приложений с фреймворком Django. Сохраняйте статью в закладки, чтобы не потерять!
Этот набор инструкций напомнит вам об основных операциях с Django, если вы работаете над веб-проектом. Сюда входят такие действия, как установка Django, запуск проекта, работа с моделями, создание домашней страницы, использование шаблонов и создание учётных записей пользователей.
Шпаргалка предназначена для тех, кто уже знаком с Python, понимает, что такое виртуальное окружение, и имеет начальные знания о веб-разработке.
Что такое Django?
Django — веб-фреймворк для создания интерактивных веб-сайтов на Python. В Django вы определяете тип данных, с которыми ваш сайт должен работать, а затем указываете, как пользователи могут взаимодействовать с этими данными. Все описанные ниже действия актуальны для Django 3.0.
Установка Django
Лучше установить Django в виртуальном окружении — virtualenv или pipenv, где ваш проект будет изолирован от других. Большинство команд, приведённых ниже, предполагают, что вы работаете в виртуальной среде.
Создать виртуальную среду
venv:
1 |
$ python –m venv ll_env |
pipenv:
1 |
$ pipenv --python 3.8 |
Активировать среду
venv, macOS and Linux:
1 |
$ source ll_env/bin/activate |
venv, Windows:
1 |
> ll_env\Scripts\activate |
pipenv:
1 |
$ pipenv shell |
Установить Django в активную среду
venv:
1 |
(ll_env)$ pip install Django |
pipenv:
1 |
pipenv install Django |
Создание проекта
Чтобы начать работу, мы создадим новый проект и базу данных, а затем запустим веб-сервер. Во всех примерах ниже проект будет называться learning_log.
Создать новый проект
1 |
$ django-admin startproject learning_log . |
Создать базу данных
1 |
$ python manage.py migrate |
Посмотреть проект
После выполнения этой команды вы можете просмотреть проект по адресу http://localhost:8000/.
1 |
$ python manage.py runserver |
Создать новое приложение
Проект Django состоит из одного или нескольких приложений.
1 |
$ python manage.py startapp learning_logs |
Перезапуск сервера разработки
Если вы вносите изменения в свой проект, но ничего не происходит, попробуйте перезапустить сервер:
1 |
$ python manage.py runserver |
Работа с моделями
Данные в проекте Django представлены в виде набора моделей — объектов Python, определяющих структуру хранения этих данных.
Определение модели
Чтобы определить модель для вашего приложения, измените файл models.py, созданный в папке приложения. Метод __str __() сообщает Python, как отображать экземпляр модели в строковом представлении. Django использует этот механизм для отображения объектов в формах.
1 2 3 4 5 6 7 8 9 |
from django.db import models class Topic(models.Model): """Тема, которую изучает пользователь.""" text = models.CharField(max_length=200) date_added = models.DateTimeField( auto_now_add=True) def __str__(self): return self.text |
Активация модели
Для использования модели приложение должно быть добавлено в список INSTALLED_APPS, который хранится в файле settings.py проекта.
1 2 3 4 5 6 |
INSTALLED_APPS = [ # Мои приложения. 'learning_logs', # Дефолтные приложения Django. 'django.contrib.admin', ] |
Миграция базы данных
База данных должна быть модифицирована для хранения данных модели. Вам нужно будет запускать эти команды каждый раз, когда вы создаете новую модель или модифицируете существующую модель.
1 2 3 |
$ python manage.py makemigrations learning_logs $ python manage.py migrate |
Создание суперпользователя
Суперпользователь — это учётная запись с доступом ко всем компонентам проекта.
1 |
$ python manage.py createsuperuser |
Регистрация модели
Вы можете зарегистрировать свою модель в панели администратора Django, чтобы упростить работу с данными в проекте. Для этого измените файл admin.py. Панель администратора находится по адресу http://localhost:8000/admin/.
1 2 3 4 |
from django.contrib import admin from .models import Topic admin.site.register(Topic) |
Создание новой модели
Новая модель может использовать существующую модель. Атрибут ForeignKey устанавливает связь между экземплярами двух связанных моделей. Обязательно мигрируйте базу данных после добавления новой модели в ваше приложение.
Определение модели с внешним ключом:
1 2 3 4 5 6 7 8 9 |
class Entry(models.Model): topic = models.ForeignKey(Topic, on_delete=models.CASCADE) text = models.TextField() date_added = models.DateTimeField( auto_now_add=True) def __str__(self): return f"{self.text[:50]}..." |
Создание простой домашней страницы
Пользователи взаимодействуют с проектом через веб-страницы. Мы создадим простую домашнюю страницу без данных. Любой странице обычно нужен URL, представление (view) и шаблон (template). Представление — функция Python, которая принимает HTML-запрос и возвращает ответ на него. Шаблон — специальный набор инструкций, позволяющий динамически генерировать HTML.
Сопоставление URL-адресов проекта
Основной файл проекта urls.py сообщает Django, где найти файлы urls.py, связанные с каждым приложением в проекте.
1 2 3 4 5 6 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('learning_logs.urls')), ] |
Сопоставление URL-адресов приложения
Файл urls.py в приложении сообщает Django, какое представление использовать для каждого URL-адреса в этом приложении. Вам нужно создать этот файл самостоятельно и сохранить его в папке приложения.
1 2 3 4 5 6 7 8 |
from django.urls import path from . import views app_name = 'learning_logs' urlpatterns = [ # Домашняя страница. path('', views.index, name='index'), ] |
Создание простого представления
Представление берёт информацию из запроса и отправляет данные в браузер, часто через шаблон. Функции представления хранятся в файле views.py. Ниже приведена простая функция, которая не извлекает какие-либо данные, но использует для отображения домашней страницы шаблон .
1 2 3 4 5 6 |
from django.shortcuts import render def index(request): """Домашняя страница.""" return render(request, 'learning_logs/') |
Написание простого шаблона
Шаблон устанавливает структуру страницы. Создайте папку с именем templates в директории проекта. Внутри templates создайте ещё одну папку с тем же именем, как у приложения. Здесь должны быть сохранены все файлы шаблонов. Шаблон домашней страницы будет сохранён как learning_logs/templates/learning_logs/.
Наследование шаблонов
Многие элементы повторяются на каждой странице сайта или же в одном из разделов. Написав один родительский шаблон для сайта или раздела, вы можете легко установить внешний вид всего сайта.
Родительский шаблон
Родительский шаблон определяет общие элементы для набора страниц, а также уникальные блоки для отдельных страниц.
1 2 3 4 5 6 7 |
<p> <a href="{% url 'learning_logs:index' %}"> Learning Log </a> </p> {% block content %}{% endblock content %} |
Дочерний шаблон
Дочерний шаблон использует тег {% extends %} для извлечения структуры родительского шаблона. Затем он переопределяет содержимое для блоков, указанных в родительском шаблоне.
1 2 3 4 5 6 7 8 9 |
{% extends 'learning_logs/base.html' %} {% block content %} <p> Learning Log helps you keep track of your learning, for any topic you're learning about. </p> {% endblock content %} |
Отступы в шаблоне
Отступы в Python обычно отбиваются четырьмя пробелами. В шаблонах вы часто можете встретить отступы в два пробела, потому что вложенность кода как правило более глубокая.
Создание страницы с данными
Большинство страниц в проекте должны показывать данные, относящиеся к текущему пользователю.
Параметры URL
URL-адрес часто принимает параметр, сообщающий ему, к каким данным из базы данных обращаться. Показанный ниже шаблон URL ищет идентификатор конкретной темы и присваивает его параметру topic_id.
1 2 3 4 5 |
urlpatterns = [ # --snip-- path('topics/<int:topic_id>/', views.topic, name='topic'), ] |
Использование данных в представлении
Представление использует параметр из URL, чтобы извлечь правильные данные из базы данных. В этом примере представление отправляет контекстный словарь в шаблон, содержащий данные, которые должны отображаться на странице. Вы можете импортировать любую модель, которую используете.
1 2 3 4 5 6 7 8 9 10 11 |
def topic(request, topic_id): """Показывает тему и все её записи.""" topic = Topic.objects.get(id=topic_id) entries = topic.entry_set.order_by( '-date_added') context = { 'topic': topic, 'entries': entries, } return render(request, 'learning_logs/topic.html', context) |
Использование данных в шаблоне
Данные, передаваемые в словаре-контексте, доступны в шаблоне. Доступ к этим данным осуществляется с помощью переменных шаблона, которые обозначены двойными фигурными скобками. Вертикальная линия после шаблонной переменной указывает на фильтр. В нашем примере фильтр с именем date форматирует объекты даты, а фильтр разрыва строки правильно отображает абзацы на веб-странице.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{% extends 'learning_logs/base.html' %} {% block content %} <p>Topic: {{ topic }}</p> <p>Entries:</p> <ul> {% for entry in entries %} <li> <p> {{ entry.date_added|date:'M d, Y H:i' }} </p> <p> {{ entry.text|linebreaks }} </p> </li> {% empty %} <li>There are no entries yet.</li> {% endfor %} </ul> {% endblock content %} |
Django Shell
Вы можете работать с проектом Django из командной строки. Это полезно для выполнения запросов и тестирования фрагментов кода.
Начать сеанс оболочки
1 |
$ python manage.py shell |
Доступ к данным из проекта
1 2 3 4 5 6 |
>>> from learning_logs.models import Topic >>> Topic.objects.all() [<Topic: Chess>, <Topic: Rock Climbing>] >>> topic = Topic.objects.get(id=1) >>> topic.text 'Chess' |
Пользователи и формы
Большинство веб-приложений позволяют посетителям создавать учётные записи. Это позволяет пользователям работать с собственными данными. Некоторые из этих данных могут быть конфиденциальными, а некоторые — общедоступными. Формы Django позволяют пользователям вводить и изменять свои данные.
Учётные записи пользователей
Учётные записи пользователей можно обрабатывать приложением — ниже оно создаётся под названием users. Пользователи должны иметь возможность зарегистрироваться, войти и выйти из аккаунта. Django автоматизирует большую часть этих действий.
Создание приложения users
После создания приложения обязательно добавьте его в INSTALLED_APPS в файле settings.py проекта.
1 |
$ python manage.py startapp users |
Добавление URL-адресов приложения users
Добавьте эти строки в файл urls.py проекта, чтобы включить в проект URL-адреса приложения users.
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('users/', include('users.urls')), path('', include('learning_logs.urls')), ] |
Использование форм в Django
Существует несколько способов создания форм и работы с ними. Вы можете использовать установки Django по умолчанию или настроить свои формы. Наиболее простой способ настроить ввод данных, основанных на ваших моделях — использование класса ModelForm. ModelForm автоматически создаёт форму на основе полей модели.
Создание URL для входа, выхода и регистрации
Пользователи смогут войти, выйти и зарегистрироваться на сайте. Создайте новый файл urls.py в папке приложения users.
1 2 3 4 5 6 7 8 9 10 11 12 |
from django.urls import path, include from . import views app_name = 'users' urlpatterns = [ # Дефолтные url для авторизации. path('', include( 'django.contrib.auth.urls')), # Страница авторизации. path('register/', views.register, name='register'), ] |
Шаблон входа
Вид входа в систему предоставляется по умолчанию, но вам необходимо указать свой собственный шаблон входа. В примере ниже шаблон отображает простую форму входа и показывает основные сообщения об ошибках. Создайте папку templates в директории приложения users, а внутри templates — папку registration. Сохраните файл как login.html.
Тег {% csrf_token %} помогает предотвратить CSRF-атаки с помощью форм. Элемент {{form.as_p}} отображает форму входа по умолчанию в формате абзаца. Элемент <input> с именем next перенаправляет пользователя на домашнюю страницу после успешного входа в систему.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{% extends "learning_logs/base.html" %} {% block content %} {% if form.errors %} <p> Your username and password didn't match. Please try again. </p> {% endif %} <form method="post" action="{% url 'users:login' %}"> {% csrf token %} {{ form.as_p }} <button name="submit">Log in</button> <input type="hidden" name="next" value="{% url 'learning_logs:index' %}"/> </form> {% endblock content %} |
Отображение текущего статуса входа
Вы можете изменить шаблон base.html, чтобы показать, вошёл ли пользователь на сайт в данный момент, и предоставить ссылку на страницы входа и выхода. Django делает объект user доступным для каждого шаблона.
Тег user.is_authenticated позволяет вам показать конкретный контент пользователям в зависимости от того, вошли они в систему или нет. Свойство {{user.username}} приветствует пользователей, которые вошли в систему. Те же, кто не вошёл в систему, увидят ссылки для регистрации или входа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<p> <a href="{% url 'learning_logs:index' %}"> Learning Log </a> {% if user.is_authenticated %} Hello, {{ user.username }}. <a href="{% url 'users:logout' %}"> Log out </a> {% else %} <a href="{% url 'users:register' %}"> Register </a> - <a href="{% url 'users:login' %}"> Log in </a> {% endif %} </p> {% block content %}{% endblock content %} |
Шаблон logged_out
Выход из системы по умолчанию отображается с помощью шаблона logged_out.html, который необходимо сохранить в папке users/templates/registration.
1 2 3 4 5 6 7 |
{% extends "learning_logs/base.html" %} {% block content %} <p> You have been logged out. Thank you for visiting! </p> {% endblock content %} |
Регистрация пользователей
Представление для регистрации должно отображать пустую форму регистрации при первом запросе страницы, а затем обработать заполненные поля. Успешная регистрация сохраняет данные пользователя, и затем выполняется вход в систему и перенаправление на домашнюю страницу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from django.shortcuts import render, redirect from django.contrib.auth import login from django.contrib.auth.forms import \ UserCreationForm def register(request): """Регистрация нового пользователя.""" if request.method != 'POST': # Отобразить пустую форму регистрации. form = UserCreationForm() else: # Обработать заполненную форму. form = UserCreationForm( data=request.POST) if form.is_valid(): new_user = form.save() # Вход в систему, переход на дом.страницу. login(request, new_user) return redirect( 'learning_logs:index') # Отобразить пустую форму или сообщение об ошибке. context = {'form': form} return render(request, 'registration/register.html', context) |
Шаблон регистрации
Шаблон register.html отображает поля формы регистрации в виде списка тегов <p>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{% extends 'learning_logs/base.html' %} {% block content %} <form method='post' action="{% url 'users:register' %}"> {% csrf_token %} {{ form.as_p }} <button name='submit'>Register</button> <input type='hidden' name='next' value="{% url 'learning_logs:index' %}"/> </form> {% endblock content %} |
Данные пользователей
У всех пользователей есть данные, которые относятся только к ним. Любая модель, подключенная напрямую к пользователю, нуждается в поле, связывающем экземпляры модели с конкретным пользователем.
Создание темы, принадлежащей пользователю
Чтобы связать данные с пользователем, импортируйте модель User и добавьте её в качестве внешнего ключа в модель данных.
После изменения модели вам нужно будет мигрировать базу данных и установить user ID для каждого существующего пользователя.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from django.db import models from django.contrib.auth.models import User class Topic(models.Model): """Тема, которую просматривает пользователь.""" text = models.CharField(max_length=200) date_added = models.DateTimeField( auto_now_add=True) owner = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.text |
Запрос данных для текущего пользователя
Объект запроса имеет атрибут user в своём представлении. Вы можете использовать этот атрибут для получения данных пользователя — их извлекает метод filter().
1 2 |
topics = Topic.objects.filter( owner=request.user) |
Ограничение доступа незарегистрированным пользователям
Некоторые страницы показываются только зарегистрированным пользователям. Представления для этих страниц могут быть защищены декоратором @login_required. Любое такое представление будет автоматически перенаправлять незарегистрированных пользователей на соответствующую страницу. Вот пример файла views.py:
1 2 3 4 5 6 7 8 |
from django.contrib.auth.decorators import \ login_required # --snip-- @login_required def topic(request, topic_id): """Показать тему и все её записи.""" |
Установка URL перенаправления
Декоратор @login_required отправляет неавторизованных пользователей на страницу входа. Добавьте следующую строку в файл settings.py, чтобы Django знал, как найти страницу входа.
1 |
LOGIN_URL = 'users:login' |
Предотвращение случайного доступа
Некоторые страницы отображают данные на основе параметров URL. Вы можете проверить, что текущий пользователь имеет права на просмотр текущих данных, и вернуть ошибку 404, если это не так.
1 2 3 4 5 6 7 8 9 10 |
from django.http import Http404 # --snip-- @login_required def topic(request, topic_id): """Показать тему и все её записи.""" topic = Topics.objects.get(id=topic_id) if topic.owner != request.user: raise Http404 # --snip-- |
Формы для редактирования данных
С Django можно создать форму с существующими данными пользователя и возможностью изменять и сохранять их.
Создание формы с исходными данными
Параметр instance позволяет указать начальные данные для формы.
1 |
form = EntryForm(instance=entry) |
Изменение данных перед сохранением
Аргумент commit = False позволяет вносить изменения перед записью в базу данных.
1 2 3 |
new_topic = form.save(commit=False) new_topic.owner = request.user new_topic.save() |
⌘⌘⌘
Django — отличный фреймворк, и мы привели лишь малую часть базовых операций в нём. Если вы хотите поэкспериментировать с Django на настоящем сервере — попробуйте наши Облачные VPS с готовым шаблоном Django и почасовой оплатой от 37 копеек. После заказа сервера Django будет готов к работе уже через минуту.
Пишите в комментариях, шпаргалки по каким языкам или фреймворкам вы хотели бы видеть в нашем блоге.
Шпаргалка основана на материалах сайта ehmatthes.github.io.