Введение в Django

29
Введение в django
  • Upload

    -
  • Category

    Education

  • view

    4.471
  • download

    4

description

Презентация django в студии Future Colors 30.04.2010

Transcript of Введение в Django

Page 1: Введение в Django

Введение в

django

Page 2: Введение в Django

django - это python

Django Версия 1.1.1 (BSD)   Проект был опубликован в 2005 г.

 Python 2.3 и выше СУБД PostgreSQL, MySQL, SQLite и Oracle.  Google App Engine

Page 3: Введение в Django

Сильные стороны django

• ORM• Автоматически генерируемая админка• Очень красивые URL• Шаблонная система• Кеширование, интернационализация, аутентификация и

другие приложения - большая коробка• Встроенный веб-сервер и система развёртывания

Page 4: Введение в Django

Структура проекта django

Page 5: Введение в Django

Создание проекта и  его приложенийс помощью консольных утилит

Создание проекта django-admin.py startproject myproject

Создание приложения cd myproject  python manage.py startapp myapp

Синхронизация моделей и БД python manage.py syncdb

Запуск встроенного сервера python manage.py runserver 

 ... и многие другие операции   

Page 6: Введение в Django

Структура директорий проекта

myproject/ myapp1/ __init__.py

models.pytests.pyviews.py

myapp2/ __init__.py

models.pytests.pyviews.py

__init__.py manage.py

settings.pyurls.py

Page 7: Введение в Django

MVT против MVC

Model View Controller

Model Template ViewUrls

Page 8: Введение в Django

Модели

Page 9: Введение в Django

Пример модели

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 = "Человеки"

Page 10: Введение в Django

Возможности ORM

Набор типов полей Строки, email, xml, числа, даты, файлы и др.

Отношения между моделями org = models.ForeignKey(Org) assigned_tickets = models.ManyToManyField(Ticket)

Абстрактные модели и наследование Мета-параметры  permissions = (("can_delete", "Удаление"),)

Page 11: Введение в Django

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)))

Page 12: Введение в Django

Работа с моделями

Добавление 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  

Свои менеджеры

Page 13: Введение в Django

Автоматическая админка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)

Page 14: Введение в Django
Page 15: Введение в Django

Шаблоны

Page 16: Введение в Django

Особенности шаблонов 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>

Page 17: Введение в Django

...продолжение

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

Page 18: Введение в Django

Пишем свои теги и фильтры

@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()}

Page 19: Введение в Django

Виды

Page 20: Введение в Django

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()}))

Page 21: Введение в Django

Функции видов

Пример:  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})

Page 22: Введение в Django

Функции видов

Варианты ответов: 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")

Page 23: Введение в Django

Формы

Page 24: Введение в Django

Формы в 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 }}

Page 25: Введение в Django

Дополнительные возможности

Page 26: Введение в Django

Аутентификация

Встроена работа с пользователями 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):    # ...

Page 27: Введение в Django

Кеширование

Настройка кеша... 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')

Page 28: Введение в Django

Сессии

Отправка 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))

Page 29: Введение в Django

the end