Бортовой журнал
Бортовой журнал

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

Посмотреть оригинальный материал можно по ссылке.

Что такое Django

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

Как установить Django

Рекомендуем установить Django Python в виртуальной среде, например, venv или pipenv. Это позволит изолировать ваш проект от других. Большая часть команд, приведенных ниже, предполагает, что вы работаете в виртуальном окружении.

Создание виртуальной среды

venv:
$ python –m venv ll_env

pipenv:
$ pipenv --python 3.8

Активация виртуальной среды

venv, Linux, macOS:
$ source ll_env/bin/activate
venv, Windows:
> ll_env\Scripts\activate
pipenv:
$ pipenv shell

Установка Django в активной среде

venv:
(ll_env)$ pip install Django

pipenv:
pipenv install Django

Установка Django на хостинге SpaceWeb

Фреймворк Django можно установить на виртуальном хостинге SpaceWeb. Для этого необходимо воспользоваться инструкцией.

Как создать проект на Django

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

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

$ django-admin startproject learning_log

Создание базы данных

$ python manage.py migrate

Просмотр проекта

После ввода этой команды вы сможете увидеть созданный проект по адресу http://localhost:8000/.

$ python manage.py runserver

Создание нового приложения

$ python manage.py startapp learning_logs

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

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

$ python manage.py runserver

Работа с моделями

Данные в проектах Django представлены в виде набора моделей. Модели в Django — это объекты Python, которые описывают структуру хранимых данных.

Определение модели

Чтобы определить модели для вашего приложения, необходимо изменить файл models.py. Этот файл хранится в папке вашего приложения. Метод __str__() сообщает Django, как представлять объекты данных на основе этой модели.

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 проекта.

INSTALLED_APPS = [
# Мои приложения.
'learning_logs',
# Дефолтные приложения Django.
'django.contrib.admin',
]

Миграция базы данных

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

$ python manage.py makemigrations learning_logs
$ python manage.py migrate

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

Суперпользователь — это учетная запись пользователя, у которой есть доступ ко всем компонентам проекта.

$ python manage.py createsuperuser

Регистрация модели

Вы можете зарегистрировать свои модели в панели администратора Django. Это упростит работу с данными в вашем проекте. Чтобы сделать это, измените файл admin.py. Панель управления администратора расположена по адресу http://localhost:8000/admin/.

from django.contrib import admin
from .models import Topic

admin.site.register(Topic)

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

Новая модель может использовать существующую модель. Атрибут ForeignKey устанавливает связь между экземплярами двух родственных моделей. Обязательно выполните миграцию базы данных после добавления новой модели в ваше приложение.

Определение модели с внешним ключом:

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-адрес, представление и шаблон.

Сопоставление URL-адресов проекта

Основной файл проекта urls.py сообщает Django, где найти файлы urls.py, которые связаны с каждым приложением в проекте.

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-адреса в приложении. Этот файл нужно будет создать самостоятельно и сохранить его в папке приложения.

from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns = [
# Домашняя страница.
path('', views.index, name='index'),
]

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

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

from django.shortcuts import render

def index(request):
"""Домашняя страница."""
return render(request,
'learning_logs/')

Написание простого шаблона

Шаблон устанавливает структуру страницы. Создайте папку с именем templates в директории проекта. Внутри папки templates создайте еще одну папку с именем приложения. Здесь будут сохранены файлы шаблонов. Путь до шаблона домашней страницы будет выглядеть как learning_logs/templates/learning_logs/index.html.

<p>Learning Log</p>

<p>Learning Log helps you keep track of your
learning, for any topic you're learning
about. </p>

Наследование шаблонов

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

Родительский шаблон

Родительский шаблон определяет общие элементы для набора страниц, а также блоки, которыми будут заполняться отдельные страницы.

<p>
<a href="{% url 'learning_logs:index' %}">
Learning Log
</a>
</p>

{% block content %}{% endblock content %}

Дочерний шаблон

Дочерний шаблон использует тег шаблона {% extends %} для извлечения структуры родительского шаблона. Затем он определяет содержимое для блоков, определенных в родительском шаблоне.

{% 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.

urlpatterns = [
# --snip--
path('topics/<int:topic_id>/', views.topic,
name='topic'),
]

Использование данных в представлении

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

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 форматирует объекты даты, а фильтр разрыва строки помогает правильно отображаться абзацам на веб-странице.

{% 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

Вы можете работать с данными в своем проекте с помощью командной строки. Это может пригодиться вам для выполнения запросов и тестирования фрагментов кода.

Запуск Shell-сессии

$ python manage.py shell

Доступ к данным из проекта

>>> 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

После создания приложения обязательно добавьте users в INSTALLED_APPS в файле settings.py проекта.

$ python manage.py startapp users

Добавление URL-адресов для приложения users

Добавьте эти строки в файл urls.py проекта, чтобы URL-адреса приложения users были включены в проект.

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.

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. Затем создайте папку registration в директории templates. Сохраните этот файл как login.html.

Тег {% csrf_token %} необходим для предотвращения CSRF-атак с помощью форм. Элемент {{ form.as_p }} отображает форму авторизации по умолчанию в формате абзаца. Элемент <input> с именем next перенаправляет пользователя на домашнюю страницу после успешной авторизации.

{% 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 }} позволит вам приветствовать пользователей, которые вошли в систему. Если пользователи не вошли в систему, то они увидят ссылки для регистрации или входа.

<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.

{% extends "learning_logs/base.html" %}
{% block content %}
<p>
You have been logged out. Thank you
for visiting!
</p>
{% endblock content %}

Регистрация пользователей

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

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>.

{% 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 для подключения каждого существующего пользователя.

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

Запрос данных для текущего пользователя

В представлении у объекта запроса есть пользовательский атрибут. Вы можете использовать этот атрибут для запроса данных пользователя. Метод filter() извлекает данные, принадлежащие текущему пользователю.

topics = Topic.objects.filter(
owner=request.user)

Ограничение доступа для незарегистрированных пользователей

Некоторые страницы должны отображаться только у зарегистрированных пользователей. Отображение этих страниц можно защитить декоратором @login_required. Любое представление с этим декоратором будет автоматически перенаправлять незарегистрированных пользователей на соответствующую страницу. Пример файла views.py:

from django.contrib.auth.decorators import \
login_required

# --snip--

@login_required
def topic(request, topic_id):
"""Показать тему и все её записи."""

Установка перенаправления URL

Декоратор @login_required отправляет неавторизованных пользователей на страницу входа. Добавьте указанную ниже строку в файл settings.py вашего проекта, чтобы Django знал, как найти вашу страницу входа:

LOGIN_URL = 'users:login'

Предотвращение случайного доступа

Некоторые страницы предоставляют данные на основе параметра в URL-адресе. Вы можете проверить, что у текущего пользователя есть права на просмотр запрошенных данных, и вернуть ошибку 404, если прав нет. Пример:

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 можно указать начальные данные для формы.

form = EntryForm(instance=entry)

Изменение данных перед сохранением

Аргумент commit=False позволяет вносить изменения перед записью данных в базу данных.

new_topic = form.save(commit=False)
new_topic.owner = request.user
new_topic.save()

Теперь вы знаете об основных операциях при разработке веб-проекта на Python, а также о том, что можно сделать на Django.

Надежный хостинг для сайта с бесплатным доменом и SSL за 199 ₽

Выбрать тариф