Spec-Zone.ru › Django 5.2

Django кратко

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

Целью этого документа является предоставление достаточного количества технических подробностей для понимания принципов работы Django, но это не обучающий курс и не справочник – но у нас есть оба! Когда вы будете готовы начать проект, вы можете начать с учебника или погрузиться в более подробную документацию.

Проектирование модели

Хотя вы можете использовать Django без базы данных, он поставляется с объектно-реляционным маппером, в котором вы описываете структуру вашей базы данных на языке Python.

Синтаксис модели данных предложения модели данных предлагает множество возможностей для представления ваших моделей – до сих пор он решал проблемы со схемой базы данных, накопившиеся за многие годы. Вот быстрый пример:

news/models.py
from django.db import models


class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name


class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

Установка

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

$ python manage.py makemigrations
$ python manage.py migrate
...\> py manage.py makemigrations
...\> py manage.py migrate

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

Используйте бесплатный API

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

# Import the models we created from our "news" app
>>> from news.models import Article, Reporter

# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.
>>> r = Reporter(full_name="John Smith")

# Save the object into the database. You have to call save() explicitly.
>>> r.save()

# Now it has an ID.
>>> r.id
1

# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'

# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith="John")
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains="mith")
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Reporter matching query does not exist.

# Create an article.
>>> from datetime import date
>>> a = Article(
...     pub_date=date.today(), headline="Django is cool", content="Yeah.", reporter=r
... )
>>> a.save()

# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith="John")
<QuerySet [<Article: Django is cool>]>

# Change an object by altering its attributes and calling save().
>>> r.full_name = "Billy Goat"
>>> r.save()

# Delete an object with delete().
>>> r.delete()

Динамический интерфейс администрирования: это не просто каркас, это весь дом

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

news/models.py
from django.db import models


class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
news/admin.py
from django.contrib import admin

from . import models

admin.site.register(models.Article)

Философия заключается в том, что ваш сайт редактируется сотрудниками, клиентами или, возможно, вами самим – и вам не нужно создавать интерфейсы для администрирования только для управления контентом.

Типичный рабочий процесс при создании приложений Django – создать модели и быстро запустить административные интерфейсы, чтобы ваши сотрудники (или клиенты) могли начать заполнять данные. Затем разрабатывается способ представления данных широкой публике.

Проектирование URL-адресов

Чистая и элегантная схема URL-адресов – важная деталь качественного веб-приложения. Django поощряет красивое проектирование URL-адресов и не добавляет ненужного мусора в URL-адреса, например, .php или .asp.

Чтобы спроектировать URL-адреса для приложения, вы создаете модуль Python, называемый URLconf. Он представляет собой содержание вашего приложения, содержащее соответствие между шаблонами URL и функциями обратного вызова Python. URLconf также служат для разделения URL-адресов и кода Python.

Вот как может выглядеть URLconf для примера Reporter/Article выше:

news/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path("articles/<int:year>/", views.year_archive),
    path("articles/<int:year>/<int:month>/", views.month_archive),
    path("articles/<int:year>/<int:month>/<int:pk>/", views.article_detail),
]

Код выше сопоставляет пути URL с функциями обратного вызова Python («представления»). Строки путей используют теги параметров для «захвата» значений из URL-адресов. Когда пользователь запрашивает страницу, Django последовательно проходит по каждому пути и останавливается на первом, который соответствует запрошенному URL-адресу. (Если ни один из них не соответствует, Django вызывает специальное представление 404.) Это очень быстро, потому что пути компилируются в регулярные выражения во время загрузки.

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

Например, если пользователь запросит URL-адрес «/articles/2005/05/39323/», Django вызовет функцию news.views.article_detail(request, year=2005, month=5, pk=39323).

Написание представлений

Каждое представление отвечает за выполнение одного из двух действий: Возвращает объект HttpResponse, содержащий содержимое запрашиваемой страницы, или генерирует исключение, например, Http404. Остальное зависит от вас.

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

news/views.py
from django.shortcuts import render

from .models import Article


def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {"year": year, "article_list": a_list}
    return render(request, "news/year_archive.html", context)

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

Проектирование шаблонов

Приведенный выше код загружает шаблон news/year_archive.html.

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

Предположим, что шаблон news/year_archive.html был найден. Вот как он может выглядеть:

news/templates/news/year_archive.html
{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Переменные заключены в двойные фигурные скобки. {{ article.headline }} означает «Вывести значение атрибута заголовка статьи». Но точки используются не только для поиска атрибутов. Они также могут выполнять поиск ключей словаря, поиск по индексу и вызовы функций.

Обратите внимание, что {{ article.pub_date|date:"F j, Y" }} использует утилиту Unix-подобного «канального соединения» (символ «|»). Это называется фильтром шаблона, и это способ фильтрации значения переменной. В данном случае фильтр даты форматирует объект Python datetime в заданном формате (как в функции date PHP).

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

Наконец, Django использует концепцию «наследования шаблонов». Это то, что делает {% extends "base.html" %}. Это означает «Сначала загрузить шаблон с именем «base», в котором определено множество блоков, и заполнить блоки последующими блоками». Короче говоря, это позволяет значительно сократить дублирование в шаблонах: каждый шаблон должен определять только то, что уникально для этого шаблона.

Вот как может выглядеть шаблон «base.html», включая использование статических файлов:

templates/base.html
{% load static %}
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static 'images/sitelogo.png' %}" alt="Logo">
    {% block content %}{% endblock %}
</body>
</html>

Проще говоря, он определяет внешний вид сайта (с логотипом сайта) и предоставляет «дыры», которые подлежат заполнению дочерними шаблонами. Это означает, что редизайн сайта может быть выполнен путем изменения одного файла – базового шаблона.

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

Обратите внимание, что вы не обязаны использовать систему шаблонов Django, если вы предпочитаете другую систему. Хотя система шаблонов Django особенно хорошо интегрирована с слоем моделей Django, ничто не заставляет вас ее использовать. В том же порядке, вы не обязаны использовать API базы данных Django. Вы можете использовать другой уровень абстракции базы данных, читать XML-файлы, читать файлы с диска или что угодно. Каждый компонент Django – модели, представления, шаблоны – не зависит от следующего.

Это только верхушка айсберга

Это был только краткий обзор функциональности Django. Некоторые другие полезные функции:

  • Система кэширования, интегрированная с memcached или другими бэкендами.
  • Система создания RSS и Atom лент, создающаяся с помощью небольшого класса Python.
  • Более привлекательные административные функции, автоматически генерируемые – этот обзор только слегка затронул эту тему.

Следующими шагами являются загрузка Django здесь, чтение учебника и присоединение к сообществу. Спасибо за интерес!

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/intro/overview/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API