e Шпаргалка Python: основные операции Django, работа с Django

Шпаргалка по Python для Django

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

Этот набор инструкций напомнит вам об основных операциях с Django, если вы работаете над веб-проектом. Сюда входят такие действия, как установка Django, запуск проекта, работа с моделями, создание домашней страницы, использование шаблонов и создание учётных записей пользователей.

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

Что такое Django?

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

Установка Django

Лучше установить Django в виртуальном окружении — virtualenv или pipenv, где ваш проект будет изолирован от других. Большинство команд, приведённых ниже, предполагают, что вы работаете в виртуальной среде.

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

venv:

$ python –m venv ll_env

pipenv:

$ pipenv --python 3.8

Активировать среду

venv, macOS and Linux:

$ 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

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

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

Создать новый проект

$ django-admin startproject learning_log .

Создать базу данных

$ python manage.py migrate

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

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

$ python manage.py runserver

Создать новое приложение

Проект Django состоит из одного или нескольких приложений.

$ python manage.py startapp learning_logs

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

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

$ python manage.py runserver

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

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

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

Чтобы определить модель для вашего приложения, измените файл models.py, созданный в папке приложения. Метод __str __() сообщает Python, как отображать экземпляр модели в строковом представлении. 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, представление (view) и шаблон (template). Представление — функция Python, которая принимает HTML-запрос и возвращает ответ на него. Шаблон — специальный набор инструкций, позволяющий динамически генерировать HTML.

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

from django.shortcuts import render

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

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

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

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

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

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

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

<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

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

Начать сеанс оболочки

$ 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

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

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

Объект запроса имеет атрибут user в своём представлении. Вы можете использовать этот атрибут для получения данных пользователя — их извлекает метод 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()

⌘⌘⌘

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

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


Шпаргалка основана на материалах сайта ehmatthes.github.io.

Похожие публикации

Аутсорсинг VS собственное производство одежды: опыт бренда кроссовок

Один способ позволяет отслеживать каждую деталь изделия, другой – сфокусироваться на брендинге и маркетинге. Разбираемся…

10 минут назад

Как сократить затраты на инфраструктуру в два раза: опыт ИТ-компании Ctrl2GO

Рассказываем, как помогли российскому разработчику систем аналитики мигрировать в частное облако и сократить затраты на…

6 часов назад

Каким должен быть сайт-визитка для эксперта

Рассказываем, как создать сайт-визитку и какой должна быть структура. Внутри — инструкция, которая поможет предпринимателям.

5 дней назад

Как продвигать бизнес с помощью геосервисов

Онлайн-карты — хорошая площадка для привлечения аудитории в бизнес. Рассказываем об инструментах продвижения в геосервисах.

6 дней назад

Как открыть своё digital-агентство

Можно стартовать с багажом знаний из найма или практически без опыта. Рассказываем, что нужно делать:…

6 дней назад

Что такое Data Science и кто такой Data Scientist

Что такое наука о данных, чем занимается Data Scientist и можно ли обучиться этой специальности…

1 неделя назад