Slide 1

Slide 1 text

Introduction to Django The web framework for perfectionists with deadlines.

Slide 2

Slide 2 text

Hi, I’m Markus Holtermann • Django Core Developer • Worked at ubuntuusers.de @m_holtermann • github.com/MarkusH

Slide 3

Slide 3 text

What is Django?

Slide 4

Slide 4 text

• Web framework • Ridiculously fast • Fully loaded • Reassuringly secure • Exceedingly scalable • Incredibly versatile

Slide 5

Slide 5 text

Architecture • Model ० Database Abstraction ० Object Relational Mapper (ORM) • Template ० Design ० HTML • View ० Business Logic

Slide 6

Slide 6 text

Webserver View ORM Database Template URLConf Forms Source: http://www.django-introduction.com/index.en.html#/4/2

Slide 7

Slide 7 text

Strengths – Weaknesses

Slide 8

Slide 8 text

• Security • Backwards compatibility • Rapid Prototyping • Loads of features • “Djangoverse” • Community • Loads of features • “Too much magic” Strengths – Weaknesses

Slide 9

Slide 9 text

Example ToDo list

Slide 10

Slide 10 text

Model from django.core.urlresolvers import reverse from django.db import models from django.utils import timezone class TodoItem(models.Model): value = models.CharField(max_length=255) created = models.DateTimeField(default=timezone.now) progress = models.SmallIntegerField(default=0) owner = models.ForeignKey(settings.AUTH_USER_MODEL) def get_absolute_url(self): return reverse('todo:detail', kwargs={'pk': self.pk})

Slide 11

Slide 11 text

Views • Create • Read • Update • Delete • List

Slide 12

Slide 12 text

from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import CreateView from .models import TodoItem class TodoItemCreateView(CreateView): fields = ('value', 'progress',) model = TodoItem @method_decorator(login_required) def dispatch(self, request, *args,**kwargs): return super().dispatch(request, *args,**kwargs) Views – Create (1)

Slide 13

Slide 13 text

class TodoItemCreateView(CreateView): # … def form_valid(self, form): form.instance.owner = self.request.user return super().form_valid(form) def get_success_url(self): return self.object.get_absolute_url() Views – Create (2)

Slide 14

Slide 14 text

from django.views.generic import DetailView class TodoItemDetailView(DetailView): model = TodoItem @method_decorator(login_required) def dispatch(self, request, *args,**kwargs): return super().dispatch(request, *args,**kwargs) def get_queryset(self): queryset = super().get_queryset() return queryset.filter(owner=self.request.user) Views – Read

Slide 15

Slide 15 text

from django.views.generic import UpdateView class TodoItemUpdateView(UpdateView): fields = ('value', 'progress',) model = TodoItem @method_decorator(login_required) def dispatch(self, request, *args,**kwargs): return super().dispatch(request, *args,**kwargs) def get_queryset(self): queryset = super().get_queryset() return queryset.filter(owner=self.request.user) Views – Update (1)

Slide 16

Slide 16 text

class TodoItemUpdateView(UpdateView): # … def get_success_url(self): return self.object.get_absolute_url() Views – Update (2)

Slide 17

Slide 17 text

from django.core.urlresolvers import reverse_lazy from django.views.generic import DeleteView class TodoItemDeleteView(DeleteView): model = TodoItem success_url = reverse_lazy('todo:list') @method_decorator(login_required) def dispatch(self, request, *args,**kwargs): return super().dispatch(request, *args,**kwargs) def get_queryset(self): queryset = super().get_queryset() return queryset.filter(owner=self.request.user) Views – Delete

Slide 18

Slide 18 text

from django.views.generic import ListView class TodoItemListView(ListView): model = TodoItem @method_decorator(login_required) def dispatch(self, request, *args,**kwargs): return super().dispatch(request, *args,**kwargs) def get_queryset(self): queryset = super().get_queryset() return queryset.filter(owner=self.request.user) Views – List

Slide 19

Slide 19 text

App URLs from django.conf.urls import url from .views import (TodoItemCreateView,TodoItemDeleteView, TodoItemDetailView, TodoItemListView,TodoItemUpdateView) urlpatterns = [ url(r'^add/$', TodoItemCreateView.as_view(), name='create'), url(r'^(?P\d+)/$', TodoItemDetailView.as_view(), name='detail'), url(r'^(?P\d+)/update/$', TodoItemUpdateView.as_view(), name='update'), url(r'^(?P\d+)/delete/$', TodoItemDeleteView.as_view(), name='delete'), url(r'^$', TodoItemListView.as_view(), name='list'), ]

Slide 20

Slide 20 text

Project URLs from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^todo/', include('todo.urls', namespace='todo')), url(r'^admin/', include(admin.site.urls)), url(r'^accounts/', include('django.contrib.auth.urls')), ]

Slide 21

Slide 21 text

Settings LOGIN_REDIRECT_URL = ‘todo:list’

Slide 22

Slide 22 text

Testing – Testability

Slide 23

Slide 23 text

Code Documentation It’s just Python. Use http://sphinx-doc.org/

Slide 24

Slide 24 text

Support – Get Help

Slide 25

Slide 25 text

• Documentation: docs.djangoproject.com • #django on irc.freenode.net • Mailing list: [email protected] • Tutorials ० Official: See the documentation ० DjangoGirls: tutorial.djangogirls.org ० Django Book: Do not use that! • Don't be afraid to commit: dont-be-afraid-to-commit.rtfd.org

Slide 26

Slide 26 text

Recommendations

Slide 27

Slide 27 text

• Django 1.8.1 (latest stable) • Python 3.4+ • PostgreSQL for production • SQLite3 only for development, if at all ० Run tests on same database as production • Start with a custom user model: ० https://docs.djangoproject.com/en/1.8/topics/ auth/customizing/

Slide 28

Slide 28 text

Tools / 3rd Party Libraries

Slide 29

Slide 29 text

• REST API Tools: ० Django Rest Framework: ▪ django-rest-framework.org ० django-nap: ▪ django-nap.rtfd.org • Search ० Elasticsearch (larger+ sites) ० Haystack + Whoosh (small sites)

Slide 30

Slide 30 text

Questions