Django в обзоре
Поскольку Django разрабатывался в динамичной среде новостной редакции, он был спроектирован для ускорения и упрощения общих задач веб-разработки. Вот краткий обзор того, как создать веб-приложение с базой данных при помощи Django.
Цель этого документа — предоставить вам достаточную техническую информацию для понимания работы Django, но это не обучающий курс и не справочник — хотя и то, и другое у нас есть! Когда вы готовы начать проект, вы можете начать с руководства или погрузиться в более подробную документацию.
Проектирование вашей модели
Хотя вы можете использовать Django без базы данных, он поставляется с объектно-реляционным отображением, в котором вы описываете структуру вашей базы данных на языке Python.
Синтаксис модели данных предлагает множество богатых способов представления ваших моделей — пока он успешно решал многолетние проблемы со схемой базы данных. Вот быстрый пример:
mysite/news/models.pyfrom 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 может автоматически создать профессиональный, готовый к использованию в производстве административный интерфейс — веб-сайт, позволяющий авторизованным пользователям добавлять, изменять и удалять объекты. Единственный необходимый шаг — зарегистрировать вашу модель в административной системе:
mysite/news/models.pyfrom 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)
mysite/news/admin.pyfrom django.contrib import admin from . import models admin.site.register(models.Article)
Философия заключается в том, что вашим сайтом пользуется персонал, клиент или, возможно, только вы — и вам не нужно самим создавать интерфейсы для управления контентом.
Один из типичных рабочих процессов при создании приложений Django — создание моделей и быстрое запуск административной части, чтобы ваш персонал (или клиенты) могли начать заполнять данные. Затем разработайте способ представления данных для публики.
Проектирование URL-адресов
Чистая и элегантная схема URL-адресов — важный элемент качественного веб-приложения. Django поощряет красивое проектирование URL-адресов и не включает ненужный мусор, например .php или .asp.
Для проектирования URL-адресов приложения вы создаёте модуль Python, называемый URLconf. Таблица содержания вашего приложения, она содержит сопоставление между шаблонами URL-адресов и функциями обратного вызова Python. URLconf также служат для разделения URL-адресов от кода Python.
Вот как может выглядеть URLconf для примера Reporter/Article:
mysite/news/urls.pyfrom 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 из вышеизложенного:
mysite/news/views.pyfrom 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 был найден. Вот как это может выглядеть:
mysite/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 «pipe» (символ «|»). Это называется фильтром шаблона, и это способ отфильтровать значение переменной. В данном случае фильтр даты форматирует объект Python datetime в указанном формате (как в функции date PHP).
Вы можете объединить столько фильтров, сколько захотите. Вы можете написать собственные фильтры шаблонов. Вы можете написать собственные теги шаблонов, которые запускают произвольный код Python в фоновом режиме.
Наконец, Django использует концепцию «наследования шаблонов». Это то, что делает {% extends "base.html" %}. Это означает «Сначала загрузить шаблон с именем „base“, который определил несколько блоков, и заполнить блоки последующими блоками». Короче говоря, это позволяет значительно сократить избыточность в шаблонах: каждый шаблон должен определять только уникальные для него элементы.
Вот как может выглядеть шаблон «base.html», включая использование статических файлов:
mysite/templates/base.html{% load static %}
<html>
<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 лент, которая позволяет создавать RSS и Atom ленты, написав небольшой класс Python.
- Более привлекательные автоматически сгенерированные административные функции — этот обзор лишь слегка затронул поверхность.
Следующие шаги: скачайте Django, прочитайте руководство и присоединяйтесь к сообществу. Спасибо за интерес!
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.2/intro/overview/