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
И с этим вы получите бесплатный и мощный Python API для доступа к данным. 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-адресов и не включает лишних элементов в 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-подобных «трубок» (символ «|»). Это называется фильтром шаблона, и это способ фильтрации значения переменной. В данном случае фильтр даты форматирует объект 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-лент, создаваемая с помощью небольшого класса Python.
- Более привлекательные автоматически сгенерированные административные функции — этот обзор лишь поверхностно коснулся этой темы.
Следующие шаги — это загрузка Django, чтение учебника и присоединение к сообществу. Спасибо за интерес!
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/intro/overview/