Взгляд на Django

В статье "Django at glance" автор представляет технические данные, чтобы понять, как функционирует Django. Статья посвящена новому релизу Django, который может существенно отличаться от предыдущих релизов.

Вы можете посмотреть предыдущие релизы здесь: Django 1.0

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

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

Разработка своей модели

Хотя вы можете использовать Django без базы данных, в него входит встроенный ORM.

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

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __unicode__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateTimeField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter)

    def __unicode__(self):
        return self.headline

Установка

Запустите утилиту Django, для автоматического создания таблиц баз данных:

manage.py syncdb

Команда syncdb просматривает все ваши доступные модели и создает таблицы в ваших базах данных для любых таблиц, которые еще не существуют.

Насладитесь свободным API

Вместе с этим, у вас есть свободный и богатый Python API для доступа к вашим данным. API создается "на лету", и нет никакой необходимости в генерации кода:

>>> from mysite.models import Reporter, Article

# No reporters are in the system yet.
>>> Reporter.objects.all()
[]

# 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()
[<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 datetime
>>> a = Article(pub_date=datetime.now(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.
>>> Article.objects.all()
[<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()
[<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")
[<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 может автоматически создать профессиональный, готовый к работе интерфейс администратора - aWeb-сайт, который позволяет зарегистрированным пользователям добавлять, изменять и удалять объекты. Это так же просто, как регистрация вашей модели на сайте администратора:

# In models.py...

from django.db import models

class Article(models.Model):
    pub_date = models.DateTimeField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter)


# In admin.py in the same directory...

import models
from django.contrib import admin

admin.site.register(models.Article)

Основная идея здесь состоит в том, что ваш сайт редактируется сотрудниками, или клиентом, или возможно только вами - и вы не хотите "возиться" с созданием интерфейсов лишь для управления контентом.

Одним из типичных рабочих процессов в создании приложений Django является создание моделей и запуск интерфейса администратора, работающего как можно быстрее, так что ваши сотрудники (или клиенты) могут начать внесение данных. Затем, разработайте способ представления данных.

Создание URLs

Красивые URLs являются важной частью Web-приложения. Django поощряет удобочитаемые URLs, и не помещает в него никакого "хлама", такого как .php или .asp.

Чтобы создать URL для приложения, вам необходимо создать Python-модуль, называющийся URLconf. В вашем приложении есть простой mapper между образцами URL и callback-функциями Python. URLconfs также служат для отделения URL от кода Python.

Вот как мог бы выглядеть URLconf для Reporter/Article:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', 'mysite.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$', 'mysite.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'mysite.views.article_detail'),
)

Код выше отображает URLs, которые являются простыми регулярными выражениями на callback-функции Python ("views"). Регулярные выражения используют круглые скобки, для "захвата" значений из URL. Когда пользователь запрашивает страницу, Django просматривает по очереди каждый шаблон, и останавливается на первом, который соответствует запрашиваемому URL. (Если ни один из них не соответствует, Django выбросит ошибку 404) Это происходит невероятно быстро, потому что регулярные выражения компилируются во время загрузки.

Как только одно из регулярных выражений совпадет, Django выполнит импорт и вызовет данный view. Каждый view передаёт запрашиваемый объект, который содержит запрашиваемые метаданные, и значения, захваченные в regex.

Например, если бы пользователь запросил URL "/articles/2005/05/39323/", Django вызвал бы функцию mysite.views.article_detail(request, '2005', '05', '39323').

Написание собственных views

Каждый view отвечает за выполнение одного из двух: возвращение объекта HttpResponse содержащего контент для запрашиваемой страницы, или выбрасывания исключения такого как Http404. Остальное зависит от вас.

Обычно, view получает данные в соответствии с параметрами, загружает шаблон и предоставляет шаблон с полученными данными. Вот пример вида для year_archive:

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})

Этот пример использует систему шаблонов, Django, которая имеет несколько мощных функций, но остается достаточно простой для использования непрограммистами.

Разработка своих шаблонов

Код выше загружает шаблон news/year_archive.html.

В Django есть способ поиска шаблона, который позволяет вам избежать дублирования шаблонов. В настройках Django, вы определяете список директорий, в которых надо искать шаблоны. Если шаблон не существует в первой директории, то проверяется вторая, и так далее.

Скажем, был найден шаблон news/article_detail.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 }} означает "Вывести значение атрибута заголовка статьи".  Но точки используются не только для атрибута поиска: Они также могут выполнять ключевой поиск по словарям, поиск индекса и запросы функций.

Вы можете соединить вместе столько фильтров, сколько захотите. Вы можете написать пользовательские фильтры. Вы можете написать пользовательские теги шаблона.

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

Вот как может выглядеть шаблон "base.html":

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="sitelogo.gif" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>

Упрощенно, он представляет "look-and-feel " сайта, и определяет "места", которые будут заполнены дочерними шаблонами. Это делает редизайн сайта таким же легким, как изменение файла - базового шаблона.

Это также позволяет создать многочисленные версии сайта, с различными базовыми шаблонами, при многократном использовании дочерних шаблонов. Создатели Django использовали эту технику для создания разнообразных версий сайтов для сотовых телефонов - простым созданием нового базового шаблона.

Поверхностный взгляд

Это был лишь краткий обзор функциональных возможностей Django. Вот еще несколько полезных функций:

  • Caching framework интегрирующийся с memcached или другими движками.
  • Syndication framework который позволяет создавать RSS и Atom-каналы так же просто, как написание малого класса Python.
  • Более интересные автоматически-генерируемые  функции для админов.

Последующие очевидные шаги для вас download Django, прочесть учебник и присоединяться к сообществу.  Спасибо за внимание!

Оригинал статьи на docs.djangoproject.com

Перевод КОМТЕТ komtet.ru

Вам также может помочь