Slide 1

Slide 1 text

What’s New in Django 1.9?

Slide 2

Slide 2 text

Hi!

Slide 3

Slide 3 text

Baptiste Mispelon

Slide 4

Slide 4 text

Django 1.9

Slide 5

Slide 5 text

Python Support

Slide 6

Slide 6 text

pip install Django==1.9b1

Slide 7

Slide 7 text

What’s new?

Slide 8

Slide 8 text

Major New Features

Slide 9

Slide 9 text

transaction.on_commit

Slide 10

Slide 10 text

from django.db import transaction with transaction.atomic(): transaction.on_commit(send_email) do_some_database_stuff()

Slide 11

Slide 11 text

AUTH_PASSWORD_VALIDATORS

Slide 12

Slide 12 text

from django.contrib.auth.password_validation import ( UserAttributeSimilarityValidator, MinimumLengthValidator, CommonPasswordValidator, NumericPasswordValidator, )

Slide 13

Slide 13 text

contrib.auth.mixins

Slide 14

Slide 14 text

from django.contrib.auth.mixins import ( AccessMixin, LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin, )

Slide 15

Slide 15 text

New Admin Theme

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

New Admin Theme

Slide 21

Slide 21 text

Can’t Upgrade Yet? pip install django-flat-theme

Slide 22

Slide 22 text

./manage.py test --parallel

Slide 23

Slide 23 text

Random Minor Features

Slide 24

Slide 24 text

contrib.postgres.JSONField

Slide 25

Slide 25 text

from django.contrib.postgres.fields import JSONField from django.db import models class Dog(models.Model): name = models.CharField(max_length=200) data = JSONField()

Slide 26

Slide 26 text

Dog.objects.create(name='Rufus', data={ 'breed': 'labrador', 'owner': {'name': 'Bob'}, })

Slide 27

Slide 27 text

Dog.objects.filter( data__breed='collie' )

Slide 28

Slide 28 text

Dog.objects.filter( data__owner__name='Bob' )

Slide 29

Slide 29 text

db.backends.postgresql

Slide 30

Slide 30 text

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

Slide 31

Slide 31 text

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

Slide 32

Slide 32 text

Which One?

Slide 33

Slide 33 text

Which One?

Slide 34

Slide 34 text

CharField.strip

Slide 35

Slide 35 text

from django import forms class NameForm(forms.Form): name = forms.CharField()

Slide 36

Slide 36 text

f = NameForm({ ‘name’: ‘ Baptiste ‘, })

Slide 37

Slide 37 text

f = NameForm({ ‘name’: ‘ Baptiste ‘, })

Slide 38

Slide 38 text

>>> f.is_valid() True >>> f.cleaned_data[‘name’] ‘Baptiste’

Slide 39

Slide 39 text

Field.disabled

Slide 40

Slide 40 text

from django import forms class PersonForm(forms.Form): name = forms.CharField() age = forms.IntegerField(disabled=True)

Slide 41

Slide 41 text

f = PersonForm( initial={‘age’: 30}, data={‘name’: ‘Baptiste’, ‘age’: 12}, )

Slide 42

Slide 42 text

>>> f.is_valid() True >>> f.cleaned_data[‘age’] 30

Slide 43

Slide 43 text

./manage.py sendtestemail

Slide 44

Slide 44 text

./manage.py dumpdata --output

Slide 45

Slide 45 text

python -m django

Slide 46

Slide 46 text

django-admin.py startproject foo python -m django startproject foo

Slide 47

Slide 47 text

--no-input

Slide 48

Slide 48 text

filter(pub_date__month__gt=6)

Slide 49

Slide 49 text

from django.db import models class Post(models.Model): title = models.CharField(max_length=100) pub_date = models.DateTimeField()

Slide 50

Slide 50 text

Post.objects.filter(pub_date__lt=timezone.now()) Post.objects.filter(pub_date__year=2015) Post.objects.filter(pub_date__year__lte=2014)

Slide 51

Slide 51 text

What’s Next?

Slide 52

Slide 52 text

What’s Next?

Slide 53

Slide 53 text

Thanks!