SlideShare a Scribd company logo
Django
Бекбулатов Александр
a.bekbulatov@corp.mail.ru
MVC
Model-view-controller – схема использования
нескольких шаблонов проектирования, с
помощью которых модель данных приложения,
пользовательский интерфейс и
взаимодействие с пользователем разделены
на три отдельных компонента так, что
модификация одного из компонентов
оказывает минимальное воздействие на
остальные.
Примеры
• Без MVC — в чистом виде PHP, ASP
• Реализации с неполным MVC — CPB
• C MVC — фреймворки CodeIgniter, Yii,
ASP.NET MVC Framework, Django, Pyramid,
Ruby on Rails
MVC
MVC в Django
Создание проекта
django-admin.py startproject myblog
myblog/
manage.py
myblog/
__init__.py
settings.py
urls.py
wsgi.py
Создание проекта
cd myblog
python manage.py runserver
Подключение базы данных
vim myblog/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '1',
'HOST': '',
'PORT': '',
}
}
python manage.py syncdb
Создание приложения
python manage.py startapp blog
blog/
__init__.py
models.py
tests.py
views.py
Подключаем приложение
vim myblog/settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'blog',
)
python manage.py syncdb
Модель
vim blog/models.py
from django.db import models
import datetime
class Category(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
def __unicode__(self):
return self.title
@models.permalink
def get_absolute_url(self):
return ('category_detail', (self.pk,))
Панель администрирования
vim myblog/urls.py
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('‘,
# url(r'^', include('blog.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
class Post(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
category = models.ForeignKey(Category)
creation_date = models.DateTimeField(default=datetime.datetime.now)
def previous_post(self):
"""Return the previous entry"""
entries = Post.objects.filter(
creation_date__lt=self.creation_date)[:1]
if entries:
return entries[0]
def next_post(self):
"""Return the next entry"""
entries =
Post.objects.filter( creation_date__gt=self.creation_date).order_
by('creation_date')[:1]
if entries:
return entries[0]
def __unicode__(self):
return self.title
@models.permalink
def get_absolute_url(self):
return ('post_detail', (self.pk,))
class Meta:
ordering = ['-creation_date']
Панель администрирования
vim blog/admin.py
from blog.models import Category, Post
from django.contrib import admin
admin.site.register(Category)
admin.site.register(Post)
Панель администрирования
python manage.py runserver
http://127.0.0.1:8000/admin/
Панель администрирования
Панель администрирования
Панель администрирования
Панель администрирования
Контроллеры
vim blog/views.py
#-*- coding: utf-8 -*-
from django.views.generic.simple import direct_to_template
from django.shortcuts import get_object_or_404
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from blog.models import Category, Post
def category(request, pk):
cat = get_object_or_404(Category, pk=pk)
post_list = Post.objects.filter(category=cat)
return direct_to_template(request, 'blog/category.html', {
'category': cat,
'post_list' : post_list
})
class PostList(ListView):
model = Post
class PostDetail(DetailView):
model = Post
Роутинг
vim blog/urls.py
from django.conf.urls import patterns, url
from blog.views import PostList, PostDetail
urlpatterns = patterns('',
(r'^$', PostList.as_view()),
url(r'^post/(?P<pk>d+)/$',
PostDetail.as_view(), name='post_detail'),
url(r'^category/(?P<pk>d+)/$',
'blog.views.category', name='category_detail'),
)
Шаблоны
vim myblog/settings.py
import os
def rel(*x):
return 
os.path.join(os.path.abspath(os.path.dirname(__file__)),
* x)
TEMPLATE_DIRS = (
rel('../templates'),
# Put strings here, like "/home/html/django_templates"
or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative
paths.
)
Шаблоны
mkdir -p templates/blog
vim templates/base.html
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<title>Блог</title>
</head>
<body>
<h1>Мой блог</h1>
{% block content %}{% endblock %}
</body>
</html>
Шаблоны
vim templates/blog/post_list.html
{% extends "base.html" %}
{% block content %}
<ul>
{% for object in object_list %}
<li><a
href="{{ object.get_absolute_url }}">{{ object
}}</a></li>
{% endfor %}
</ul>
{% endblock %}
Шаблоны
Шаблоны
vim templates/blog/post_detail.html
{% extends "base.html" %}
{% block content %}
<h2>{{ object }}</h2>
<p><small>{{ object.creation_date }} <a
href="{{ object.category.get_absolute_url}}">{{
object.category }}</a></p>
<div>{{ object.content }}</div>
{% endblock %}
Шаблоны
Шаблоны
vim templates/blog/category.html
{% extends "base.html" %}
{% block content %}
<h2>{{ category }}</h2>
<ul>
{% for object in post_list %}
<li><a
href="{{ object.get_absolute_url}}">{{ object }}</a></li>
{% endfor %}
</ul>
{% endblock %}
Шаблоны
Работа с формами
vim blog/forms.py
#-*- coding: utf-8 -*-
from django import forms
class ContactForm(forms.Form):
email = forms.EmailField(label=u'Ваш e-mail', max_length=100)
message = forms.CharField(label=u'Сообщение',
widget=forms.Textarea)
Работа с формами
vim blog/views.py
from blog.forms import ContactForm
from django.core.mail import send_mail
from django.http import HttpResponseRedirect
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
subject = u'Сообщение с блога'
message = form.cleaned_data['message']
sender = form.cleaned_data['email']
recipients = ['a.bekbulatov@corp.mail.ru']
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/')
else:
form = ContactForm()
return direct_to_template(request, 'blog/contact.html', {
'form': form
})
Работа с формами
vim blog/urls.py
urlpatterns = patterns('',
(r'^$', PostList.as_view()),
url(r'^post/(?P<pk>d+)/$', PostDetail.as_view(),
name='post_detail'),
url(r'^category/(?P<pk>d+)/$', 'blog.views.category',
name='category_detail'),
(r'^contacts/$', 'blog.views.contact'),
)
Работа с формами
vim templates/blog/contact.html
{% extends "base.html" %}
{% block content %}
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Отправить" />
</form>
{% endblock %}
Работа с формами
python manage.py runserver
http://127.0.0.1:8000/contacts/

More Related Content

PDF
10 - Web-технологии. MVC фреймворки (продолжение)
PDF
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
PDF
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
PDF
Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"
PDF
Сергей Максимов — BEMTREE — генерируй дерево
PDF
11 - Web-технологии. Работа с СУБД
PDF
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
10 - Web-технологии. MVC фреймворки (продолжение)
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"
Сергей Максимов — BEMTREE — генерируй дерево
11 - Web-технологии. Работа с СУБД
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"

What's hot (16)

PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPT
Form api в drupal 7
PDF
Angular 2: Всех переиграл
PPTX
Mastering Declarative Database Schema - MageConf 2019
PDF
Продвинутое использование ActiveRecord в Yii2
PDF
Mysql replication
PPT
Общая архитектура Yii2
PDF
Михаил Давыдов — JavaScript: События
PPT
Top 10 problems supporting Magento customers
PPTX
Selenium: начало работы
PPTX
Разработка расширяемых приложений на Django
PDF
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
PDF
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
PDF
Примеры решения типичных задач за рамками ядра Yii2
PDF
Ф'Yii'лософия
PPT
Forms 2 - Drupal 6 - Полный контроль над формами
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
Form api в drupal 7
Angular 2: Всех переиграл
Mastering Declarative Database Schema - MageConf 2019
Продвинутое использование ActiveRecord в Yii2
Mysql replication
Общая архитектура Yii2
Михаил Давыдов — JavaScript: События
Top 10 problems supporting Magento customers
Selenium: начало работы
Разработка расширяемых приложений на Django
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
Примеры решения типичных задач за рамками ядра Yii2
Ф'Yii'лософия
Forms 2 - Drupal 6 - Полный контроль над формами
Ad

Viewers also liked (6)

PDF
RC3 bassani 2012
PPTX
Measurement & ROI: How to get 1+1=3
PDF
Vmware
PPT
Danianddaid
PDF
Co0de Magazine
PPT
Feudalismo(2)
RC3 bassani 2012
Measurement & ROI: How to get 1+1=3
Vmware
Danianddaid
Co0de Magazine
Feudalismo(2)
Ad

Similar to Web весна 2012 лекция 7 (17)

PPT
Django шахрай. версия 4
PPTX
Web осень 2013 лекция 7
PPT
Мульти-доменность в Django проекте
PDF
Лекция #6. Введение в Django web-framework
PDF
09 - Web-технологии. MVC фреймворки
PPTX
Web осень 2013 лекция 8
PDF
13 - Web-технологии. Отображение данных
PPTX
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
PDF
django cheBit'11
 
PPT
Введение в Django
PDF
12 - Web-технологии. Django модели
PDF
Лекция #7. Django ORM
PPT
Py con 2010_django_project_dev_full_circle
PPT
Django. Web project full circle
PPT
Django. Web project full circle
PDF
Webdev7: Обработка HTTP запросов. Django Views
PDF
Webdev7 (2)
Django шахрай. версия 4
Web осень 2013 лекция 7
Мульти-доменность в Django проекте
Лекция #6. Введение в Django web-framework
09 - Web-технологии. MVC фреймворки
Web осень 2013 лекция 8
13 - Web-технологии. Отображение данных
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
django cheBit'11
 
Введение в Django
12 - Web-технологии. Django модели
Лекция #7. Django ORM
Py con 2010_django_project_dev_full_circle
Django. Web project full circle
Django. Web project full circle
Webdev7: Обработка HTTP запросов. Django Views
Webdev7 (2)

More from Technopark (20)

PDF
Лекция 11. Вычислительная модель Pregel
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 13. YARN
PDF
Лекция 12. Spark
PDF
Лекция 10. Apache Mahout
PDF
Лекция 9. ZooKeeper
PDF
Лекция 7. Введение в Pig и Hive
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 2. Основы Hadoop
PDF
Лекция 1. Введение в Big Data и MapReduce
PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PPT
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
PPTX
СУБД 2013 Лекция №9 "Безопасность баз данных"
PPTX
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
PPTX
СУБД 2013 Лекция №5 "Определение узких мест"
PPTX
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Лекция 11. Вычислительная модель Pregel
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 13. YARN
Лекция 12. Spark
Лекция 10. Apache Mahout
Лекция 9. ZooKeeper
Лекция 7. Введение в Pig и Hive
Лекция 6. MapReduce в Hadoop (графы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 4. MapReduce в Hadoop (введение)
Лекция 3. Распределённая файловая система HDFS
Лекция 2. Основы Hadoop
Лекция 1. Введение в Big Data и MapReduce
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...

Web весна 2012 лекция 7

  • 2. MVC Model-view-controller – схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента так, что модификация одного из компонентов оказывает минимальное воздействие на остальные.
  • 3. Примеры • Без MVC — в чистом виде PHP, ASP • Реализации с неполным MVC — CPB • C MVC — фреймворки CodeIgniter, Yii, ASP.NET MVC Framework, Django, Pyramid, Ruby on Rails
  • 4. MVC
  • 6. Создание проекта django-admin.py startproject myblog myblog/ manage.py myblog/ __init__.py settings.py urls.py wsgi.py
  • 8. Подключение базы данных vim myblog/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', 'USER': 'root', 'PASSWORD': '1', 'HOST': '', 'PORT': '', } } python manage.py syncdb
  • 9. Создание приложения python manage.py startapp blog blog/ __init__.py models.py tests.py views.py
  • 10. Подключаем приложение vim myblog/settings.py INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'blog', ) python manage.py syncdb
  • 11. Модель vim blog/models.py from django.db import models import datetime class Category(models.Model): title = models.CharField(max_length=255) description = models.TextField(blank=True) def __unicode__(self): return self.title @models.permalink def get_absolute_url(self): return ('category_detail', (self.pk,))
  • 12. Панель администрирования vim myblog/urls.py from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('‘, # url(r'^', include('blog.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), )
  • 13. class Post(models.Model): title = models.CharField(max_length=255) content = models.TextField() category = models.ForeignKey(Category) creation_date = models.DateTimeField(default=datetime.datetime.now) def previous_post(self): """Return the previous entry""" entries = Post.objects.filter( creation_date__lt=self.creation_date)[:1] if entries: return entries[0] def next_post(self): """Return the next entry""" entries = Post.objects.filter( creation_date__gt=self.creation_date).order_ by('creation_date')[:1] if entries: return entries[0] def __unicode__(self): return self.title @models.permalink def get_absolute_url(self): return ('post_detail', (self.pk,)) class Meta: ordering = ['-creation_date']
  • 14. Панель администрирования vim blog/admin.py from blog.models import Category, Post from django.contrib import admin admin.site.register(Category) admin.site.register(Post)
  • 20. Контроллеры vim blog/views.py #-*- coding: utf-8 -*- from django.views.generic.simple import direct_to_template from django.shortcuts import get_object_or_404 from django.views.generic.detail import DetailView from django.views.generic.list import ListView from blog.models import Category, Post def category(request, pk): cat = get_object_or_404(Category, pk=pk) post_list = Post.objects.filter(category=cat) return direct_to_template(request, 'blog/category.html', { 'category': cat, 'post_list' : post_list }) class PostList(ListView): model = Post class PostDetail(DetailView): model = Post
  • 21. Роутинг vim blog/urls.py from django.conf.urls import patterns, url from blog.views import PostList, PostDetail urlpatterns = patterns('', (r'^$', PostList.as_view()), url(r'^post/(?P<pk>d+)/$', PostDetail.as_view(), name='post_detail'), url(r'^category/(?P<pk>d+)/$', 'blog.views.category', name='category_detail'), )
  • 22. Шаблоны vim myblog/settings.py import os def rel(*x): return os.path.join(os.path.abspath(os.path.dirname(__file__)), * x) TEMPLATE_DIRS = ( rel('../templates'), # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. )
  • 23. Шаблоны mkdir -p templates/blog vim templates/base.html <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Блог</title> </head> <body> <h1>Мой блог</h1> {% block content %}{% endblock %} </body> </html>
  • 24. Шаблоны vim templates/blog/post_list.html {% extends "base.html" %} {% block content %} <ul> {% for object in object_list %} <li><a href="{{ object.get_absolute_url }}">{{ object }}</a></li> {% endfor %} </ul> {% endblock %}
  • 26. Шаблоны vim templates/blog/post_detail.html {% extends "base.html" %} {% block content %} <h2>{{ object }}</h2> <p><small>{{ object.creation_date }} <a href="{{ object.category.get_absolute_url}}">{{ object.category }}</a></p> <div>{{ object.content }}</div> {% endblock %}
  • 28. Шаблоны vim templates/blog/category.html {% extends "base.html" %} {% block content %} <h2>{{ category }}</h2> <ul> {% for object in post_list %} <li><a href="{{ object.get_absolute_url}}">{{ object }}</a></li> {% endfor %} </ul> {% endblock %}
  • 30. Работа с формами vim blog/forms.py #-*- coding: utf-8 -*- from django import forms class ContactForm(forms.Form): email = forms.EmailField(label=u'Ваш e-mail', max_length=100) message = forms.CharField(label=u'Сообщение', widget=forms.Textarea)
  • 31. Работа с формами vim blog/views.py from blog.forms import ContactForm from django.core.mail import send_mail from django.http import HttpResponseRedirect def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): subject = u'Сообщение с блога' message = form.cleaned_data['message'] sender = form.cleaned_data['email'] recipients = ['a.bekbulatov@corp.mail.ru'] send_mail(subject, message, sender, recipients) return HttpResponseRedirect('/') else: form = ContactForm() return direct_to_template(request, 'blog/contact.html', { 'form': form })
  • 32. Работа с формами vim blog/urls.py urlpatterns = patterns('', (r'^$', PostList.as_view()), url(r'^post/(?P<pk>d+)/$', PostDetail.as_view(), name='post_detail'), url(r'^category/(?P<pk>d+)/$', 'blog.views.category', name='category_detail'), (r'^contacts/$', 'blog.views.contact'), )
  • 33. Работа с формами vim templates/blog/contact.html {% extends "base.html" %} {% block content %} <form action="" method="post">{% csrf_token %} {{ form.as_p }} <input type="submit" value="Отправить" /> </form> {% endblock %}
  • 34. Работа с формами python manage.py runserver http://127.0.0.1:8000/contacts/