Краткий обзор 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-адресов и не помещает в URL-адреса лишних слов, таких как .phpили .asp.

Чтобы разработать URL-адреса для приложения, вы создаете модуль Python, называемый URLconf . Оглавление для вашего приложения, оно содержит сопоставление между шаблонами URL и функциями обратного вызова Python. URLconfs также служат для отделения 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-адрес «/ article / 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 }}

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

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

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

Вот как может выглядеть шаблон 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 , прочитать руководство и присоединиться к сообществу . Спасибо за интерес!

Copyright ©2021 All rights reserved