Upload
technopark
View
153
Download
1
Embed Size (px)
Citation preview
Django
Бекбулатов Александр[email protected]
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.pyDATABASES = { '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.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
Модель
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,))
Панель администрирования
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)),)
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.pyfrom blog.models import Category, Postfrom 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_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
Роутинг
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'),
)
Шаблоны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/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>
Шаблоны
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.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 })
Работа с формами
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'),
)
Работа с формами
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/