Как получить данные из базы данных в Django и отобразить их в HTML?

Django предоставляет мощный ORM (Object-Relational Mapper) для взаимодействия с базами данных и удобные инструменты для отображения данных в HTML-шаблонах. Эта статья охватывает ключевые шаги этого процесса, предназначенная для разработчиков уровня Middle и Senior.

Настройка подключения к базе данных в Django

Конфигурация settings.py: определение параметров базы данных

В файле settings.py определите параметры подключения к вашей базе данных. Основные параметры:

  • ENGINE: Движок базы данных (например, 'django.db.backends.postgresql').
  • NAME: Имя базы данных.
  • USER: Имя пользователя базы данных.
  • PASSWORD: Пароль пользователя базы данных.
  • HOST: Адрес хоста базы данных.
  • PORT: Номер порта базы данных.

Пример:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

Миграции: создание и применение миграций

Django использует миграции для синхронизации структуры базы данных с моделями. После изменения моделей необходимо создать миграции и применить их:

python manage.py makemigrations
python manage.py migrate

Проверка подключения к базе данных

Простейший способ проверить подключение — выполнить любой запрос к базе данных через Django shell:

python manage.py shell

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

Определение моделей Django для работы с данными

Создание моделей в файле models.py

Модели Django представляют структуру данных. Каждая модель – это класс, наследуемый от django.db.models.Model. Атрибуты класса соответствуют полям таблицы базы данных.

Пример:

from django.db import models

class AdCampaign(models.Model):
    name: models.CharField = models.CharField(max_length=200, verbose_name='Название кампании')
    start_date: models.DateField = models.DateField(verbose_name='Дата начала')
    end_date: models.DateField = models.DateField(verbose_name='Дата окончания')
    budget: models.DecimalField = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Бюджет')
    target_audience: models.TextField = models.TextField(verbose_name='Целевая аудитория')

    def __str__(self) -> str:
        """Возвращает строковое представление объекта."""
        return self.name

    class Meta:
        verbose_name: str = 'Рекламная кампания'
        verbose_name_plural: str = 'Рекламные кампании'

Связи между моделями

Django поддерживает различные типы связей:

  • ForeignKey: Отношение «один ко многим».
  • ManyToManyField: Отношение «многие ко многим».
  • OneToOneField: Отношение «один к одному».

Регистрация моделей в admin.py

Регистрация моделей в admin.py позволяет управлять данными через Django Admin:

from django.contrib import admin
from .models import AdCampaign

@admin.register(AdCampaign)
class AdCampaignAdmin(admin.ModelAdmin):
    list_display: tuple[str] = ('name', 'start_date', 'end_date', 'budget')
    search_fields: tuple[str] = ('name', 'target_audience')
    list_filter: tuple[str] = ('start_date', 'end_date')

Извлечение данных из базы данных

Использование ORM Django: запросы через QuerySet API

ORM Django позволяет выполнять запросы к базе данных с использованием Python кода. Основные методы:

  • all(): Получение всех объектов.
  • get(): Получение одного объекта по условию.
  • filter(): Фильтрация объектов по условию.

Пример:

Реклама
from .models import AdCampaign

# Получение всех рекламных кампаний
all_campaigns = AdCampaign.objects.all()

# Получение кампании по имени
campaign = AdCampaign.objects.get(name='Весенняя распродажа')

# Получение кампаний с бюджетом больше 10000
high_budget_campaigns = AdCampaign.objects.filter(budget__gt=10000)

Фильтрация данных

Методы filter() и exclude() используются для фильтрации данных. Q-объекты позволяют строить сложные запросы с использованием логических операторов.

from django.db.models import Q

# Кампании, начавшиеся после 2024-01-01 или с бюджетом больше 5000
filtered_campaigns = AdCampaign.objects.filter(Q(start_date__gt='2024-01-01') | Q(budget__gt=5000))

# Кампании, не закончившиеся до 2024-06-01
excluded_campaigns = AdCampaign.objects.exclude(end_date__lt='2024-06-01')

Сортировка данных

Метод order_by() позволяет сортировать данные по одному или нескольким полям:

# Сортировка по дате начала в порядке убывания
sorted_campaigns = AdCampaign.objects.order_by('-start_date')

Выборка определенных полей

Методы values() и values_list() позволяют выбрать только определенные поля из модели. values() возвращает список словарей, а values_list() — список кортежей.

# Получение названий и бюджетов кампаний
campaign_data = AdCampaign.objects.values('name', 'budget')

# Получение списка названий кампаний
campaign_names = AdCampaign.objects.values_list('name', flat=True)

Передача данных в HTML-шаблон

Создание View

View – это функция или класс, обрабатывающий HTTP-запрос и возвращающий HTTP-ответ. В View происходит получение данных из базы и передача их в шаблон.

from django.shortcuts import render
from .models import AdCampaign

def campaign_list(request):
    """Отображает список рекламных кампаний."""
    campaigns: list[AdCampaign] = AdCampaign.objects.all()
    context: dict[str, list[AdCampaign]] = {'campaigns': campaigns}
    return render(request, 'campaigns/campaign_list.html', context)

Контекст шаблона

Контекст шаблона – это словарь, содержащий данные, которые будут доступны в шаблоне. В примере выше, данные о кампаниях передаются в шаблоне под ключом 'campaigns'.

Использование TemplateView и ListView

TemplateView – это базовый класс для отображения простых шаблонов. ListView – это специализированный класс для отображения списков объектов. ListView автоматически предоставляет контекстную переменную с именем object_list, содержащую список объектов.

Отображение данных в HTML-шаблоне

Создание HTML-шаблона

HTML-шаблон использует Django Template Language (DTL) для отображения данных. DTL предоставляет синтаксис для переменных, циклов, условных операторов и фильтров.

Циклы for

Цикл for используется для отображения списков данных:

<ul>
    {% for campaign in campaigns %}
        <li>{{ campaign.name }} - {{ campaign.budget }}</li>
    {% endfor %}
</ul>

Условные операторы if/else

Условные операторы позволяют отображать данные в зависимости от условий:

{% if campaigns %}
    <p>Найдено {{ campaigns|length }} кампаний.</p>
{% else %}
    <p>Кампании не найдены.</p>
{% endif %}

Фильтры шаблонов

Фильтры шаблонов используются для форматирования данных. Примеры:

  • date: Форматирование даты.
  • truncatechars: Обрезание текста до определенной длины.
  • currency: Форматирование чисел как валюты (требует установки django-money или аналогичного пакета).
<p>Дата начала: {{ campaign.start_date|date:"d.m.Y" }}</p>
<p>Описание: {{ campaign.target_audience|truncatechars:100 }}</p>

В заключение, Django предоставляет все необходимые инструменты для эффективного извлечения данных из баз данных и отображения их в HTML-шаблонах. Использование ORM, View и DTL позволяет создавать сложные веб-приложения с минимальными усилиями.


Добавить комментарий