Spec-Zone.ru › Django 3.1

Django одним взглядом

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

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

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

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

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

mysite/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

Имея это, у вас есть бесплатный и богатый 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.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)
mysite/news/admin.py
from 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.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 из примера выше:

mysite/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 был найден. Вот как это может выглядеть:

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/3.1/intro/overview/

Spec-Zone.ru

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