Slide 1

Slide 1 text

Andrew Godwin http://www.flickr.com/photos/caroslines/1371200717/ What's new in Django 1.3?

Slide 2

Slide 2 text

Hi, I'm Andrew. Serial Python developer Django core committer Co-founder of ep.io (Python hosting platform)

Slide 3

Slide 3 text

Django: A Very Brief History Initial release in 2005 1.0 released in 2008 1.3 released March 2011

Slide 4

Slide 4 text

1.3 was the "bugfix release" The plan: No major features, quick release

Slide 5

Slide 5 text

1.3 was the "bugfix release" The plan: No major features, quick release The result: 2 major features, 10 months

Slide 6

Slide 6 text

1.3 was the "bugfix release" The plan: No major features, quick release The result: 2 major features, 10 months We'll get the next one out quicker...

Slide 7

Slide 7 text

New Features Class-based views Logging contrib.staticfiles unitttest2 on_delete TemplateResponse

Slide 8

Slide 8 text

Notable Changes CSRF on AJAX requests Less swearwords Translation/i18n improvements No more mod_python No more XMLField render() shortcut

Slide 9

Slide 9 text

Class-Based Views Biggest change in 1.3 Not required for all new views Designed to simplify common patterns

Slide 10

Slide 10 text

CBV: Before def object_detail( request, year, month, day, queryset, date_field, month_format='%b', day_format='%d', object_id=None, slug=None, slug_field='slug', template_name=None, template_name_field=None, template_loader=loader, extra_context=None, context_processors=None, template_object_name='object', mimetype=None, allow_future=False ):

Slide 11

Slide 11 text

CBV: After class AccountDetail(DetailView): model = Account context_object_name = "account" slug_field = "snail" def get_context_data(self, **kwargs): context = super(AccountDetail, self)\ .get_context_data(**kwargs) context['books'] = Book.objects.all() return context

Slide 12

Slide 12 text

CBV: Simple views too! class AccountDetail(TemplateView): template_name = "mytempl.html" def get_context_data(self, **kwargs): return { "books": Book.objects.all(), "is_evil": True, }

Slide 13

Slide 13 text

Other uses Refactor common parts into superclasses Mixins for adding-on functionality Mutate the input or output

Slide 14

Slide 14 text

Logging Now actually sensible, not just emails Uses standard Python logging library Configured using the LOGGING setting

Slide 15

Slide 15 text

LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'handlers': { 'console':{ 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', }, 'myproject.custom': { 'handlers': ['console', 'mail_admins'], 'level': 'INFO', } } }

Slide 16

Slide 16 text

staticfiles Lets apps ship with their static files View to serve them in development ./manage.py collectstatic for production

Slide 17

Slide 17 text

unittest2 Better than unittest (obviously) Many new assertion methods Test skipping Expected failures Much more...

Slide 18

Slide 18 text

unittest2 Bundled with Django Just change: import unittest from django.utils import unittest to

Slide 19

Slide 19 text

on_delete Deleting rows just got better! Cascade delete (as before) Set to NULL Raise ProtectedError Set to arbitary value

Slide 20

Slide 20 text

TemplateResponse A HTTPResponse class you can change Template only run at end of middleware Change context, or even template

Slide 21

Slide 21 text

TemplateResponse Example from django.template.response \ import TemplateResponse def blog_index(request): return TemplateResponse( request, 'entry_list.html', {'entries': Entry.objects.all()}, ) ... response.context_data['foo'] = 'bar'

Slide 22

Slide 22 text

CSRF on AJAX requests CSRF is a hard, hard problem Flash plus 307 redirect = fail You'll have to start supplying CSRF tokens to your JavaScript

Slide 23

Slide 23 text

Less Swearwords Guaranteed, or your money back. Also gone: "asshat", "asshead".

Slide 24

Slide 24 text

Translation / i18n Marking for ambiguous meanings Overrideable translations for apps Deprecation of project-wide translations

Slide 25

Slide 25 text

No more mod_python It's dead, Jim. If you're still using it, move to mod_wsgi or gunicorn now, please.

Slide 26

Slide 26 text

No more XMLField We're not really sure why it was there in the first place.

Slide 27

Slide 27 text

render() shortcut Like render_to_response, but : Less characters to type Uses RequestContext Handy for those not on CBV

Slide 28

Slide 28 text

How do you upgrade? Should be mostly seamless. You'll get warnings for deprecated settings (e.g. DATABASE_NAME)

Slide 29

Slide 29 text

What's going to be in 1.4? We're not quite sure yet. Possible: App refactor HTML5 doctype ORM changes

Slide 30

Slide 30 text

Future features GSOC should give us: Template engine refactor New form rendering Schema alteration low-level API Composite fields

Slide 31

Slide 31 text

Thank you. Andrew Godwin @andrewgodwin [email protected]