Узреваем красоту Django. Part 2
Вторая часть туториала о Django, где опять буду расказывать как создается полнофункциональный сайт. Это не подробнейшее руководство - за этим смотрите документацию на djangoproject.com и читайте книгу djangobook.com (на русском — djbook.ru). Это всего лишь практический туториал. И сегодня расскажу о:- статические файлы
- статические страницы — flatpages
- шаблоны
- google_analytics
- debug_toolbar
Cтатические файлы
В любом проекте есть статические файлы(css, js, image и другие). На продакшин сервере мы их будем раздавать через Nginx, но при самой разработке ставить nginx для таких целей как-то не красиво, поэтому будем их раздавать через Django. Поместим все наши статические файлы в папку проекта media. Теперь откроем urls.py, который как помним отвечает за роутинг и изменим его:# это у нас уже было
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^contact/$', 'press_contact.views.contact' ),
#(r'^login/', include('press_auth.urls') ),
(r'^admin/', include(admin.site.urls) ),
)
# это мы добавляем
from django.conf import settings
if settings.DEBUG:
urlpatterns += patterns('',
(r'^robots.txt$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'path': "robots.txt"}),
(r'^favicon.ico$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'path': "favicon.ico"}),
(r'^media/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
В нашем добавленом коде сначала импортируем настройки, а потом смотрим если режим отладки то используем несколько стандартных views, незнаю как правильно их называть, но по сути views это функция которая обрабатывает запрос и отдает пользователю страницу. Создавать их будем в 3-ем уроке. Итак в наших urlpatterns мы указываем регулярное выражение с которым будет сравниваться URL, дальше функция что должна этот запрос обработать и дополнительные параметры. Подробнее о функции django.views.static.serve и ее параметрах на http://docs.djangoproject.com/en/dev/howto/static-files/. Мы же добавили три паттерна, первые два на обработку файлов robots.txt и favicon.ico, а третий уже на обработку всех остальных. Теперь если запустить сервер, то можна посмотреть медиа файлы.
Статические страницы — flatpages
Чаще всего сайту необходимы статические страницы — типа «О сайте», «Правила» и другие. Их проще всего создавать используя стандартную application Django - flatpages. Для ее подключения нужно добавить в файле settings.py строчки:MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', #эту строчку добавляем
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'django.contrib.flatpages', #эту строчку добавляем
)
Установим application командой:
manage.py syncdb
Если мы перейдем сейчас в админку http://127.0.0.1/admin/, то там увидим раздел Flatpages где можно создавать статические страницы в удобном интерфейсе. Нажмем на Add flat pages и увидим форму с 4 полями. В первом указываем URL странички, пусть будет для примера /about/, во втором поле указываем заголовок — О сайте, а в третьем сам текст странички. Дальше нужно указать к какому сайту будет принадлежать страница, а поскольку у нас один сайт то со списка выбираем gread.org.ua, и можна нажимать на Save. Теперь перейдем на страницу 127.0.0.1/about/ и увидим ошибку что шаблон flatpages/default.html не найдем. Исправимся… Создадим в папке проекта templates папку flatpages, а в ней файл default.html, который возьмем с официальной документации — http://docs.djangoproject.com/en/dev/ref/contrib/flatpages/ :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>Как видим шаблон представляет собою обычный html-файл в который в нужных местах вставляются переменные между тегами {{ }}. Переменные могут быть разными, в даном случае это обьект записи базы данных. И мы через точку обращаемся к полям. Тоесть, flatpages это переменная записи с базы данных, а title и content поля в ней.
Шаблоны
Кроме переменных в шаблонах можна размещать теги между {% %}, можна использовать как стандарные теги, так и свои. Начнем со стандартных.Для каждого шаблона создавать свое отображение не очень хорошо, поэтому давайте напишем общий шаблон base.html в каталоге templates, что может выглядеть так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>GRead</title>
<link rel="icon" type="image/x-icon" href="{{ MEDIA_URL }}favicon.ico" />
<link rel="stylesheet" href="{{ MEDIA_URL }}css/screen.css" type="text/css" media="screen, projection" />
<script type="text/javascript" src="{{ MEDIA_URL }}js/script.js"></script>
</head>
<body>
<div class="page">
<h1>{% block title %}{% endblock %}</h1>
<span>{% block content %}{% endblock %}</span>
</div>
</body>
</html>В нем видим уже извесные нам переменные {{ MEDIA_URL }} которые добавляются автоматически с конфига, в нашем случае это будет /media/. Также видим первый для нас тег block {% block title %}{% endblock %} - сначала идет название тега block, а потом параметр title — название самого блока. Теперь мы можем создать новый шаблон, который будет наследовать базовый и в нем переопределять блоки. Тоесть если в шаблоне встретяться блоки с названием title или content то их содержание измениться в базовом шаблоне на новое. К примеру теперь наш шаблон отображение flatpages может выглядеть так:
{% extends 'base.html' %}
{% block title %}
{{ flatpage.title }}
{% endblock %}
{% block content %} {{ flatpage.content }} {% endblock %}В нем мы сначала используем тег extends которым говорим что этот шаблон расширяет базовый шаблон 'base.html' и при этом нужно вместо существующих блоков в базовом шаблоне встроить новые значения, в которых мы помещаем переменные flatpage.title в блок title, и flatpage.content в content. Все очень логично и красиво!
google_analytics
Мы сейчас научились работать со стандартным application, но есть же много сторонних. К примеру разберем как добавить application google_analytics, что находится на страничке http://code.google.com/p/django-google-analytics/. Для его установки после скачивания поместим его в каталог нашего проекта, а дальше по инструции в файл settings.py добавим в INSTALLED_APPS строку google_analytics. Теперь посмотрим на пример использования и изменим наш файл base.html:{% load analytics %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
много-много текста
<body>
{% analytics "UA-7097802-2" %}
</body>
</html>Как видим для использования пользовательских тегов их нужно загрузить тегом load — {% load analytics %}. А дальше можна его использовать: {% analytics «UA-7097802–2» %} — указав сначала имя тега, а потом параметры.
debug_toolbar
Еще одним application, которого я вставляю в каждый проект есть debug_toolbar, что очень сильно помагает при отладке. Этого application'a много модификаций, но большинство глючные, но в одной пока что багов е заметил это от xdissent. И исходники можна скачать на страничке http://github.com/xdissent/django-debug-toolbar/tree/master. Установка тоже простая, после скачивания и копирования в каталог проекта изменим файл settings.py:MIDDLEWARE_CLASSES = (
'debug_toolbar.middleware.DebugToolbarMiddleware',
#...
)
DEBUG_TOOLBAR_CONFIG = {
'INTERCEPT_REDIRECTS' : False,
}
INSTALLED_APPS = (
#...
'debug_toolbar',
)Очень хорошое описание debug_toolbar было когда-то опубликовано на Хабре — http://habrahabr.ru/blogs/django/50221/
------------
На этом завершим эту часть статьи. Исходники находятся на http://github.com/presidentua/gread/tree/master. Что бы все посмотреть нужно их скачать, дальше установить manage.py syncdb и запустить manage.py runserver 80. Но я же советую проделать все самим — это не займет много времени.В следующей части мы перейдем к созданию своих application и напишем свой тег для шаблонной системы.
Пока;)
PS: я постоянно application называю application, хотя в русскоязыной литературе его переводят как модуль, но я как-то уже привык называть это апликейшн.
Содержание:
Часть 1 - http://tutamc.com/node/183
Часть 2 - http://tutamc.com/node/186
Часть 3 - http://tutamc.com/node/194
Часть 4 - http://tutamc.com/node/199
