Краткий обзор Django
Поскольку Django разрабатывался в условиях динамично работающей редакции новостей, он был спроектирован так, чтобы упростить и ускорить выполнение типичных задач веб-разработки. Ниже представлен неформальный обзор создания веб-приложения с базой данных на Django.
Цель этого документа — дать вам достаточно технических сведений, чтобы понять, как работает Django. Однако это не учебник и не справочник — хотя у нас есть и то и другое! Когда будете готовы начать проект, вы можете начать с учебника или сразу перейти к более подробной документации.
Спроектируйте модель
Хотя Django можно использовать и без базы данных, в его состав входит объектно-реляционный преобразователь, позволяющий описать структуру базы данных с помощью кода на Python.
Синтаксис моделей данных предлагает множество гибких способов представления моделей и уже помог решить накопившиеся за долгие годы проблемы проектирования схем баз данных. Вот краткий пример:
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 может автоматически создать профессиональный, готовый к эксплуатации интерфейс администрирования — веб-сайт, который позволяет прошедшим аутентификацию пользователям добавлять, изменять и удалять объекты. Для этого нужно лишь зарегистрировать модель на сайте администратора:
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)
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:
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:
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 укажите список каталогов для поиска шаблонов. Если шаблон не найден в первом каталоге, Django проверит второй и так далее.
Предположим, что шаблон 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 (символ «|»). Он называется фильтром шаблона и позволяет преобразовать значение переменной. В данном случае фильтр даты форматирует объект datetime Python в заданном формате (так же, как функция 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, ничто не обязывает вас её использовать. Более того, вам необязательно использовать и 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/6.0/intro/overview/