Введение в Django
description
Transcript of Введение в Django
Введение в
django
django - это python
Django Версия 1.1.1 (BSD) Проект был опубликован в 2005 г.
Python 2.3 и выше СУБД PostgreSQL, MySQL, SQLite и Oracle. Google App Engine
Сильные стороны django
• ORM• Автоматически генерируемая админка• Очень красивые URL• Шаблонная система• Кеширование, интернационализация, аутентификация и
другие приложения - большая коробка• Встроенный веб-сервер и система развёртывания
Структура проекта django
Создание проекта и его приложенийс помощью консольных утилит
Создание проекта django-admin.py startproject myproject
Создание приложения cd myproject python manage.py startapp myapp
Синхронизация моделей и БД python manage.py syncdb
Запуск встроенного сервера python manage.py runserver
... и многие другие операции
Структура директорий проекта
myproject/ myapp1/ __init__.py
models.pytests.pyviews.py
myapp2/ __init__.py
models.pytests.pyviews.py
__init__.py manage.py
settings.pyurls.py
MVT против MVC
Model View Controller
Model Template ViewUrls
Модели
Пример модели
from django.db import models
class Person(models.Model): first_name = models.CharField('Имя', max_length=30)
last_name = models.CharField('Фамилия', max_length=30) def __unicode__(self): return self.name
class Meta: ordering = ["-id"]
verbose_name_plural = "Человеки"
Возможности ORM
Набор типов полей Строки, email, xml, числа, даты, файлы и др.
Отношения между моделями org = models.ForeignKey(Org) assigned_tickets = models.ManyToManyField(Ticket)
Абстрактные модели и наследование Мета-параметры permissions = (("can_delete", "Удаление"),)
QuerySet и работа с ним в примерах
User.objects.all()
Org.objects.filter(members__name__endwith='слав')
Post.objects.filter(title__startswith='Как') .exclude(pub_date__gte=datetime.now()) .filter(pub_date__gte=datetime(2010, 1, 1))
Entry.objects.all().order_by('title')[5:10] ~ OFFSET 5 LIMIT 5 Post.objects.get( Q(title__startswith='Почему'), Q(pub_date=date(2010, 1, 1)) | Q(pub_date=date(2010, 5, 6)))
Работа с моделями
Добавление p = Person(first_name="Иван", last_name="Иванов")
p.save()
Выборка связанных beatles.members.all()
ringo.group_set.all()
Автоматическое связывание сравните: e = Post.objects.get(id=5) print e.author и e = Post.objects.select_related().get(id=5) print e.author
Свои менеджеры
Автоматическая админкаclass Event(models.Model): what = models.CharField('Что', max_length=150) where = models.CharField('Где', max_length=150) when = models.DateField('Когда') descr = models.TextField('Описание', blank=True, null=True) show = models.BooleanField('Показывать в общедоступном списке') public = models.BooleanField('Опубликовано') date = models.DateTimeField('Время создания', auto_now_add=True) image = ThumbnailImageField('Изображение', upload_to='uploads', blank=True, null=True) url = models.CharField('Код', max_length=100, editable=False)
class Meta: ordering = ['-date'] verbose_name = 'Анонс мероприятия' verbose_name_plural = 'Анонсы мероприятия'
def hideEvents(modeladmin, request, queryset): queryset.update(show=False)hideEvents.short_description = u'Снять с публикации'
class EventAdmin(admin.ModelAdmin): list_display = ('what', 'where', 'when', 'url', 'show', 'public', 'date') search_fields = ('what', 'where', 'descr') list_filter = ('date', 'show', 'public') actions = [hideEvents]
admin.site.register(Event, EventAdmin)
Шаблоны
Особенности шаблонов django• Никакого питона ;-))• Система наследования шаблонов• Блоки, переопределение блоков• Фильтры
Пример:
<html><head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}Мой сайтик{% endblock %}</title></head><body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Главная</a></li> <li><a href="/blog/">Блог</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div></body></html>
...продолжение
{% extends "base.html" %} {% load image_helper %}
{% block title %}Блог моего замечательного сайта{% endblock %}
{% block content %}{% for entry in blog_entries %}
<div class="{% cycle 'even_row' 'odd_row' %}"> <h2>{{ entry.title|upper|safe }}</h2> <p>{{ entry.body }}</p>
<div class="author">{{ entry.author.name|default: 'аноним' }}</div> <div class="author">{% related_images entry.tags %}</div> </div>
{% endfor %}{% endblock %}
Пишем свои теги и фильтры
@register.filter(name='cut')@stringfilterdef cut(value, arg): return value.replace(arg, '')
@register.inclusion_tag('results.html')def show_results(poll): return {'poll_set': Poll.get_stat()}
Виды
URL-отображения
Пример: from django.conf.urls.defaults import *
from django.views.generic import list_detailfrom django.views.generic.simple import redirect_to, direct_to_templatefrom django.contrib import adminfrom myproject.myapp.views import entries, postfrom myproject.myapp.models import User
urlpatterns = patterns('', # админка (r'^admin$', redirect_to, { 'url': 'admin/' }), (r'^admin/', include(admin.site.urls)), # блог (r'^blog/$', entries), (r'^blog/(?P<id>\d+)/$', post), # статика ('^about/$', direct_to_template, {'template': 'about.html'}) # пользователи (r'^users/$', list_detail.object_list, {'queryset': User.objects.all()}))
Функции видов
Пример: from django.http import Http404from myproject.myapp.models import User
def detail(request, user_id): try: u = User.objects.get(pk=user_id) except User.DoesNotExist: raise Http404 return render_to_response('users/detail.html', {'user': u})
Функции видов
Варианты ответов: return HttpResponse('<html><body>Привет всем!</body></html>')
return HttpResponse(status=403) return redirect(object) # с использованием get_absolute_url()my_object = get_object_or_404(MyModel, pk=1)
"Тяжёлое" взаимодействие с шаблонами t = loader.get_template('myapp/template.html')c = Context({'foo': 'bar'})return HttpResponse(t.render(c), mimetype="application/xhtml+xml")
Формы
Формы в django
Конструирование формы: from django import forms
class ContactForm(forms.Form): subj = forms.CharField(max_length=100) message = forms.CharField() sender = forms.EmailField()
Работа с формой:
form = ContactForm(request.POST)if form.is_valid(): data = form.cleaned_data
Форма из модели from django.forms import ModelFormfrom myproject.myapp.models import Article
class ArticleForm(ModelForm): class Meta: model = Article
Вывод формы:{{ form }}{{ form.as_table }}{{ form.as_ul }}{{ form.as_p }}
Дополнительные возможности
Аутентификация
Встроена работа с пользователями request.user.is_authenticated() logout(request)
@login_requireddef my_view(request): # ...
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
@user_passes_test(lambda u: u.has_perm('polls.can_vote'))def my_view(request): # ...
Кеширование
Настройка кеша... CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
CACHE_BACKEND = 'db://my_cache_table'
...и его использование @cache_page(60 * 15)
def my_view(request): pass
@cache_control(must_revalidate=True, max_age=3600)
@never_cache
{% load cache %}{% cache 500 sidebar %} тут наш sidebar {% endcache %}
cache.set('a', 1) / .get('a') / .delete('a')
Сессии
Отправка e-mail send_mail('Тема', 'Сообщение.', '[email protected]',
['[email protected]'], fail_silently=False)
Компонент flatpages
Локализация (даты, админка...)
Пагинация p = Paginator(objects, 10)
Sitemap на основе get_absolute_url()
Генерация RSS
Поддержка JSON response.write(serializers.serialize('json', object))
the end