34
Django Бекбулатов Александр [email protected]

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

Embed Size (px)

Citation preview

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

Django

Бекбулатов Александр[email protected]

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

MVC

Model-view-controller – схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента так, что модификация одного из компонентов оказывает минимальное воздействие на остальные.

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

Примеры

• Без MVC — в чистом виде PHP, ASP

• Реализации с неполным MVC — CPB

• C MVC — фреймворки CodeIgniter, Yii, ASP.NET MVC Framework, Django, Pyramid, Ruby on Rails

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

MVC

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

MVC в Django

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

Создание проекта

django-admin.py startproject myblog

myblog/

manage.py

myblog/

__init__.py

settings.py

urls.py

wsgi.py

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

Создание проекта

cd myblog

python manage.py runserver

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

Подключение базы данных

vim myblog/settings.pyDATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', 'USER': 'root', 'PASSWORD': '1', 'HOST': '', 'PORT': '', }}

python manage.py syncdb

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

Создание приложения

python manage.py startapp blog

blog/

__init__.py

models.py

tests.py

views.py

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

Подключаем приложение

vim myblog/settings.pyINSTALLED_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

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

Модель

vim blog/models.pyfrom django.db import modelsimport 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,))

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

Панель администрирования

vim myblog/urls.pyfrom django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin:from django.contrib import adminadmin.autodiscover() urlpatterns = patterns('‘, # url(r'^', include('blog.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)),)

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

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']

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

Панель администрирования

vim blog/admin.pyfrom blog.models import Category, Postfrom django.contrib import admin admin.site.register(Category)admin.site.register(Post)

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

Панель администрирования

python manage.py runserver

http://127.0.0.1:8000/admin/

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

Панель администрирования

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

Панель администрирования

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

Панель администрирования

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

Панель администрирования

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

Контроллеры

vim blog/views.py#-*- coding: utf-8 -*-from django.views.generic.simple import direct_to_templatefrom django.shortcuts import get_object_or_404from django.views.generic.detail import DetailViewfrom django.views.generic.list import ListViewfrom 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

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

Роутинг

vim blog/urls.pyfrom django.conf.urls import patterns, urlfrom 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'),

)

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

Шаблоны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.)

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

Шаблоны

mkdir -p templates/blogvim 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>

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

Шаблоны

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 %}

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

Шаблоны

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

Шаблоны

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 %}

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

Шаблоны

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

Шаблоны

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 %}

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

Шаблоны

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

Работа с формами

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)

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

Работа с формами

vim blog/views.pyfrom blog.forms import ContactFormfrom django.core.mail import send_mailfrom 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 = ['[email protected]'] send_mail(subject, message, sender, recipients) return HttpResponseRedirect('/') else: form = ContactForm()

return direct_to_template(request, 'blog/contact.html', { 'form': form })

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

Работа с формами

vim blog/urls.pyurlpatterns = 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'),

)

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

Работа с формами

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 %}

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

Работа с формами

python manage.py runserver

http://127.0.0.1:8000/contacts/