3. Возможности
• подключаемые приложения
• ORM
• диспетчер URL на основе регулярных выражений
• расширяемая система шаблонов с тегами и наследованием
• авторизация и аутентификация
• библиотека для работы с формами (наследование, построение
форм по существующей модели БД)
• встроенный интерфейс администратора
4. Подключаемые приложения
• Проекты состоят из приложений
• Приложения могут использоваться в разных
проектах
• Приложениями можно делиться :)
5. Model
Модель в Django — это описание данных, которые
хранятся в БД, выполненное в виде кода на языке
Python.
6. Model
Модель:'
'
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
country = models.CharField(max_length=50)
website = models.URLField()
Автоматически сгенерированная таблица:'
'
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
7. ORM
Простые запросы:'
• Publisher.objects.all()
• Publisher.objects.filter(name=‘Apress’) - возвращает список
• Publisher.objects.get(name=‘Apress') - возвращает один элемент
• Publisher.objects.order_by(«address»)
Составные запросы:'
• Publisher.objects.filter(country="U.S.A.").order_by("-name")
8. Представления и привязка к URL
Представление:'
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello, world")
URL:'
from django.conf.urls.defaults import *
from mysite.views import hello
urlpatterns = patterns('',
('^hello/$', hello),
)
9. Как Django обрабатывает запрос
• Приходит запрос к /hello/.
• Django просматривает файл привязки в поисках первого
шаблона, который совпадёт с запрошенным URL.
• Если такой шаблон найден, Django вызывает
ассоциированную с ним функцию представления.
• Функция представления возвращает HttpResponse.
• Django преобразовывает HttpResponse в соответствующий
HTTP отклик, который реализует страницу.
10. Динамические URL
Представление:'
def hours_ahead(request, offset):
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)
URL:'
urlpatterns = patterns('',
(r'^time/plus/d+/$', hours_ahead),
)
11. Шаблоны
• Вы не можете создать переменную или вызвать функцию с
параметрами
• Любой текст взятый в скобки {{ }} является переменной
({{ name }})
• Любой текст взятый в фигурные скобки и проценты
является тегом ({% for item in list %})
• Конструкция {{ name | lower }} является фильтром
12. Теги
• if/else
{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% endif %}
'
• for
<ul>
{% for item in tem_list %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
'
• forloop/forloop0
{% for item in list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
13. Фильтры
Шаблонные фильтры представляют собой простой способ
изменения значения переменных перед их отображением
{{ name|lower }}
Использование множественного фильтра
{{ my_list|first|upper }}
Некоторые фильтры принимают аргументы
{{ text|truncatewords:"30" }}
14. Взаимодействие шаблонов и представлений
Плохой способ:'
def current_datetime(request):
now = datetime.datetime.now()
fp = open('/home/djangouser/templates/mytemplate.html')
t = Template(fp.read())
fp.close()
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
Хороший способ:'
def current_datetime(request):
now = datetime.datetime.now()
context = {'current_date': now}
return render_to_response(‘current_datetime.html', context)
'
15. Наследование шаблонов
Базовый шаблона — основа вашей страницы, которую позже будут
заполнять дочерние шаблоны
«base.html»:
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
'
Дочерние шаблоны могут заполнять содержимое блоков
«some.html»:
'
{% extends "base.html" %}
'
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
16. Админка
model.py:'
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
country = models.CharField(max_length=50)
website = models.URLField()
'
admin.py:'
admin.site.register(Publisher)