Web Development With Python and Django New
Web Development With Python and Django New
www.EngineeringBooksPdf.com
Today
• Iteratively build a full-featured site
• Background for each feature
• Implement a feature
• Review our example solution
• Keep yours? git show tag
• Follow directly? git reset --hard tag
www.EngineeringBooksPdf.com
Useful Links
• http://docs.python.org
• https://docs.djangoproject.com
• https://github.com/finiteloopsoware/
django-precompiler/wiki
www.EngineeringBooksPdf.com
Let’s Have a Show of Hands...
www.EngineeringBooksPdf.com
Django
www.EngineeringBooksPdf.com
Django?
www.EngineeringBooksPdf.com
Django
www.EngineeringBooksPdf.com
Django
• A high-level Python web framework
• Encourages rapid development and clean,
pragmatic design
• “For perfectionists with deadlines”
• Focus on automation and DRY
• Widely supported, many deployment
options
www.EngineeringBooksPdf.com
Perhaps You’ve Heard Of...
• Disqus • Pinterest
• Instagram • PolitiFact.com
• Mozilla • Rdio
• OpenStack
www.EngineeringBooksPdf.com
Django
• ORM • Cache infrastructure
• Automatic admin • Internationalization
interface
• Command-line job
• Regex-based URL design framework
• Templating system
www.EngineeringBooksPdf.com
Python
(the Short-Short Version)
www.EngineeringBooksPdf.com
Python is...
• Dynamic • Exceptional
• Interpreted • Comfortable
• Duck-Typed • Readable
• Object-Oriented • Opinionated
• Functional • Batteries Included
• Strongly-Namespaced • Community
www.EngineeringBooksPdf.com
Interactive Shell
$ python
>>> print "Hello, world!"
Hello, world!
>>>
$ python3
>>> print("Hello, world!")
Hello, world!
>>>
www.EngineeringBooksPdf.com
Comments
# Best. Code. Evar.
www.EngineeringBooksPdf.com
Booleans and Null
True
False
None
www.EngineeringBooksPdf.com
Strings
'Hello, world!'
"Hello, world!"
"""Hello,
world!"""
u"Hëllö, wörld!"
www.EngineeringBooksPdf.com
String Operations
"foo" + "bar"
"foo"[0]
"foo"[:1]
"foo".upper()
len("foo")
www.EngineeringBooksPdf.com
Numeric Types
42
42.0
42L
www.EngineeringBooksPdf.com
Lists, Tuples, and Sets
['a', 'b', 'c']
www.EngineeringBooksPdf.com
Sequence Operations
[...][0]
[...][-1]
[...].append(4)
[...].extend([4, 5, 6])
[...].pop()
len([...])
www.EngineeringBooksPdf.com
Dictionaries
{'key1': 'value1', 'key2': 'value2'}
www.EngineeringBooksPdf.com
Dictionary Operations
{...}['key1']
{...}.get('key2', default)
{...}.keys()
{...}.values()
{...}.items()
len({...})
www.EngineeringBooksPdf.com
Assignment & Comparison
foo = 'bar'
foo == 'baz'
foo != 'baz'
foo is None
www.EngineeringBooksPdf.com
Flow Control
if expression:
...
elif expression:
...
else:
...
www.EngineeringBooksPdf.com
Flow Control
for item in sequence:
if expression:
continue
if expression:
break
www.EngineeringBooksPdf.com
Flow Control
while expression:
if expression:
continue
if expression:
break
www.EngineeringBooksPdf.com
Functions
def foo():
return 42
def foo(bar):
return bar
www.EngineeringBooksPdf.com
Decorators
@bar
def foo():
return 42
@baz('xyzzy')
def quux():
return 42
www.EngineeringBooksPdf.com
Classes
class Foo(object):
www.EngineeringBooksPdf.com
Docstrings
"Modules can have docstrings."
class Foo(object):
"Classes can have docstrings too."
www.EngineeringBooksPdf.com
Exceptions
try:
raise Exception("OH NOES!")
except:
log_error()
raise
else:
do_some_more()
finally:
clean_up()
www.EngineeringBooksPdf.com
Namespaces
import logging
www.EngineeringBooksPdf.com
Introspection
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__',
'__format__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__',
'__weakref__']
www.EngineeringBooksPdf.com
Introspection
>>> help(Foo)
Help on class Foo in module __main__:
class Foo(__builtin__.object)
| Classes can have docstrings too.
|
| Methods defined here:
|
| __init__(self, bar)
| So can functions/methods.
| ...
--------------------------------------------------------
| Data descriptors defined here:
www.EngineeringBooksPdf.com
And more...
• Generators • Properties
• Generator Expressions • Context Managers
• List Comprehensions • Class Decorators
• Set Comprehensions • Abstract Base Classes
• Dictionary • Metaclasses
Comprehensions
www.EngineeringBooksPdf.com
Style: PEP-8
• No tabs • Line breaks around
78-79 chars
• Four-space indents
• Some other OCD-
• Don’t mix tabs & spaces pleasing ideas :-)
• lower_case_methods
• CamelCaseClasses
www.EngineeringBooksPdf.com
Setup
www.EngineeringBooksPdf.com
Environment Setup
• Mac or Linux? You’ve already got Python!
• You’ll also need Git if you don’t have it;
download it from http://git-scm.com or use
your package manager to install it
• Windows? Well, then...
www.EngineeringBooksPdf.com
Windows Setup
• Portable Python and Portable Git
• Won’t modify your system at all
• Can be easily uninstalled
• If you want to permanently install Python
and Git you can easily do that too
www.EngineeringBooksPdf.com
Portable Python 2.7
• Download http://bit.ly/13eyQGn
http://p.osuosl.org/pub/portablepython/v2.7/PortablePython_2.7.3.1.exe
www.EngineeringBooksPdf.com
Portable Git
• Download http://bit.ly/X4dGps
http://msysgit.googlecode.com/files/Git-1.8.0-preview20121022.exe
www.EngineeringBooksPdf.com
Fixing the Path
• Download:
https://gist.github.com/4399659
• Save it as a file named run-cmd.bat
• Run it
• Download won't work?
p://p.codemash.org/webdev_with_django
www.EngineeringBooksPdf.com
Installing Packages
• easy_install: easy_install package
• pip: pip install package
www.EngineeringBooksPdf.com
Installing Packages
• Installed packages go into a site-packages
directory in your Python lib
• That’s the “system Python” by default
• But different programs may need different
versions of packages...
• So we have virtual environments!
www.EngineeringBooksPdf.com
Virtual Environments
• virtualenv
• Creates an isolated Python environment
with its own site-packages
• Install whatever you want without fouling
anything else up
www.EngineeringBooksPdf.com
Python 2 or 3?
• The future of Python is Python 3
• Django 1.5 has experimental Python 3
support
• Python 2.7 is still recommended for
production applications
• Django 1.6 will fully support Python 3
www.EngineeringBooksPdf.com
Activate the Virtual Environment
# Mac/Linux/etc...
$ virtualenv django-precompiler
$ cd django-precompiler
$ source bin/activate
# Windows
www.EngineeringBooksPdf.com
The Django Stack
www.EngineeringBooksPdf.com
Request
Django
Response
www.EngineeringBooksPdf.com
Request
Framework
Middleware
Django
URLs
Response
Views
Models Templates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
The Project...
www.EngineeringBooksPdf.com
CODE SMASH!
• Code Smash is a fictional soware
development conference for people who
need to punch out awesome code
• It needs a website!
• We’re going to build one
www.EngineeringBooksPdf.com
Starting a Project
# Normally...
$ git init src
# Today...
$ git clone https://github.com/finiteloopsoftware/
django-precompiler.git src
$ cd src
www.EngineeringBooksPdf.com
Defining Requirements
• requirements.txt
• A basic example:
MyApp
Framework==0.9.4
Library>=0.2
http://someserver.org/packages/MyPackage-3.0.tar.gz
www.EngineeringBooksPdf.com
Requirements
• Create a requirements.txt
• Require Django version 1.5; use:
https://www.djangoproject.com/download/1.5c1/tarball/
www.EngineeringBooksPdf.com
Installing Requirements
$ pip install -r requirements.txt
www.EngineeringBooksPdf.com
Starting a Project
# Mac/Linux/etc.
# Windows
www.EngineeringBooksPdf.com
New Project Contents
src/
codesmash/
__init__.py
settings.py
urls.py
wsgi.py
manage.py
www.EngineeringBooksPdf.com
A Static Home Page
www.EngineeringBooksPdf.com
Templates
• Make a templates directory under src:
$ mkdir templates
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
URLs
• Map URLs in requests to code that can be
executed
• Regular expressions!
• Subsections of your site can have their own
urls.py modules (more on this later)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
URLs
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'codesmash.views.home', name='home'),
)
www.EngineeringBooksPdf.com
Views
• Code that handles requests
• Other frameworks oen call these
“controllers”
• Basically a function that:
• gets a request passed to it
• returns text or a response
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Views
from django.http import HttpResponse
def my_view(request):
return HttpResponse("Hello, world!")
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Views
from django.http import HttpResponse
from django.template import Context, loader
def my_view(request):
template = loader.get_template('template.html')
context = Context({ ... })
return HttpResponse(template.render(context))
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Views
from django.shortcuts import render
def my_view(request):
return render(request, 'template.html', {...})
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 1
• Create a template for the homepage
• Create a view that will respond with the
rendered template
• Connect the / URL to the view
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex01
www.EngineeringBooksPdf.com
Contact Form
www.EngineeringBooksPdf.com
Apps
• Django believes strongly in separating
chunks of a site into apps that can be reused
• Ecosystem of reusable apps available
• Create an app; from the src directory:
$ django-admin.py startapp myapp
Middleware
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
New App Contents
src/
codesmash/
myapp/
__init__.py
models.py
tests.py <-- you should write them!
views.py
Middleware
templates/
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
App URLs
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^$', 'my_view', name='my_form'),
...
)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Connecting App URLs
# Use include to connect a regex to an app's urls.py
# Use namespace to keep app URL names nicely isolated
urlpatterns = patterns('',
(r'^myapp/',
include('myapp.urls', namespace='myapp')),
...
)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Form Validation
• Why?
• Classes for each kind of input field
• Form class to gather input fields
• View method uses the form class to validate
inputs
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
A Very Simple Form
from django import forms
class MyForm(forms.Form):
name = forms.CharField(max_length=30)
email = forms.EmailField()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Using a Form in a View
from myapp.forms import MyForm
def my_view(request):
form = MyForm(request.POST or None)
if request.method == "POST" and form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
# do something great with that data
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Django Template Language
• Call a function or do logic:
{% ... %}
• Variable substitution:
{{ bar }}
• Filters:
Framework
{{ foo|bar }} Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Forms in Templates
<html>
...
<body>
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Sending Mail
• Add an EMAIL_BACKEND in settings.py
EMAIL_BACKEND = \
'django.core.mail.backends.console.EmailBackend'
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 2
• Create a contact app
• Create a contact form with subject,
message, and sender’s email address
• Create view to display and process the form
and “send” the message
• Connect the view to “/contact” URL Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex02
www.EngineeringBooksPdf.com
Redirecting on Success
• Make the POST action redirect with a GET
on successful processing
• Avoid “resubmit form” issues when
reloading or returning to success page
(browser back button)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Redirecting
from django.shortcuts import redirect
def my_view(request):
...
return redirect('namespace:name')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 3
• Make a separate contact form URL and
template for displaying a success message
• Update the POST handler to redirect to the
success page
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex03
www.EngineeringBooksPdf.com
A Consistent Appearance
www.EngineeringBooksPdf.com
Template Inheritance
• Define a base template for the site
• Other templates extend the base template
• Blocks allow child templates to inject
content into areas of the parent template
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
base.html
<!DOCTYPE html>
<html>
<head>
<meta name="..." content="...">
<title>{% block title %}My Site{% endblock %}</
title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
Framework
</html>
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
helloworld.html
{% extends "base.html" %}
{% block content %}
<h1>Hey! Great!</h1>
<p>Sure is some lovely content right here.</p>
<p>Yup.</p>
{% endblock %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 4
• Refactor those templates!
• Make a base.html with appropriate blocks
• Make other templates extend it and fill in
the blocks
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex04
www.EngineeringBooksPdf.com
User Registration
www.EngineeringBooksPdf.com
No Need to Reinvent
• Django comes with a robust user
framework: django.contrib.auth
• Registration
• Login/Logout
• Password Recovery
Framework
• Etc. Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Database Settings
import os
PROJECT_ROOT = os.path.abspath(
os.path.join(os.path.dirname(__file__), ".."))
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(
PROJECT_ROOT, "database.db") Framework
}
Middleware
}
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Create the Database
$ python manage.py syncdb
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Extend the UserCreationForm
from django.contrib.auth.forms import UserCreationForm
class RegistrationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
fields = ("username", "email")
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Register the User
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Login Aer Registration
from django.contrib.auth import authenticate, login
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'])
login(request, user)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
The User Object
• Always have one in every request
• Always available to templates
• Can be anonymous or populated depending
on whether the user has authenticated
www.EngineeringBooksPdf.com
Exercise 5
• Start a new app called • Profile page should just
“accounts” display username and email
• Make the view handle POSTs • Link to registration from the Framework
– check the form, register the header
Middleware
user, log in, and redirect to a
user profile page URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex05
www.EngineeringBooksPdf.com
User Login & Logout
www.EngineeringBooksPdf.com
More Reusable Goodness
• django.contrib.auth provides URLs and
views for login and logout
• Will want to provide our own templates
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
URLs
urlpatterns = patterns('',
...
(r'auth/', include('django.contrib.auth.urls',
namespace='auth')),
...
)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Templates to Override
• templates/registration/login.html
• templates/registration/logged_out.html
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Login/Logout Links
{% url 'auth:login' %}
{% url 'auth:logout' %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Differentiate Logged In/Out
{% if user.is_authenticated %}
...
{% else %}
...
{% endif %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 6
• Enable auth URLs • Show username in
header when user is
• Add login and logout logged in
links to the site header
• Link to user profile when
• Show login when user is user is logged in
logged out, logout when
user is logged in • Customize login and
logout pages
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex06
www.EngineeringBooksPdf.com
Django Admin
www.EngineeringBooksPdf.com
Django Admin
• Free CRUD!
• Navigate database data by model
• Make changes
• Highly customizable
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Enabling the Admin App
• Uncomment admin lines from
INSTALLED_APPS in settings.py
• Uncomment admin lines from the project’s
urls.py
• Mini-exercise: go do that :-)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Demo Time!
git reset --hard ex07
www.EngineeringBooksPdf.com
CMS Pages
www.EngineeringBooksPdf.com
django.contrib.flatpages
• Store simple “flat” HTML pages in the
database
• Has a URL, title, and content
• Useful for one-off pages with no logic that
don’t deserve full apps
• Add/edit content via the admin app Framework
Middleware
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
settings.py
• Add to INSTALLED_APPS:
django.contrib.flatpages
• Add to MIDDLEWARE_CLASSES:
django.contrib.flatpages.middleware.FlatpageFallback
Middleware
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
urls.py
•Change root URL to use flatpage:
url(r'^$', 'django.contrib.flatpages.views.flatpage',
{'url': '/' }, name='home')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Make a Flatpage Template
• Put it in templates/flatpages/default.html
• In the title block, add:
{{ flatpage.title }}
• In the content block, add:
{{ flatpage.content }}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex08
www.EngineeringBooksPdf.com
Meanwhile, in the admin app...
www.EngineeringBooksPdf.com
Conference Talks:
An App with a Custom Data Model
www.EngineeringBooksPdf.com
Models
• Model classes are the nouns of the system
• Used to create database tables
• Integrated with the ORM to interact with
the database
• Need to `python manage.py syncdb`
when adding a new model class Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Models
from django.db import models
class Thingy(models.Model):
name = models.CharField(max_length=255)
awesome = models.BooleanField(default=True)
description = models.TextField(blank=True)
def __str__(self):
return self.name
Framework
Middleware
def __unicode__(self): # note: not in Python 3
return unicode(str(self))
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 9
• Create a “talks” app to manage talks
• Create a Talk model; it should have:
• title - up to 255 characters
• approved - true or false, default false
• recording_release - true or false, default false
• abstract - text describing the talk
Framework
URLs
• notes - text about the talk that won't be public
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex09
www.EngineeringBooksPdf.com
Wiring the Model for Admin Access
• Each app manages its own admin wiring
• Goes into an admin.py within the app
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
admin.py
from django.contrib import admin
from myapp.models import Thingy
admin.site.register(Thingy)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 10
• Create an admin.py for the talks app
• Register the Talk model
• Start up the admin app and verify that Talks
appears
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex10
www.EngineeringBooksPdf.com
Pluralize All the Thingys!
class Thingy(model.models):
...
class Meta:
verbose_name_plural = "Thingies"
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Relations
• Foreign key (one-to-many)
• Many-to-many
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Foreign Key Relations
class Thingy(models.Model):
...
class Gadget(models.Model):
...
class Gizmo(models.Model):
thingy = models.ForeignKey(Thingy)
gadget = models.ForeignKey(Gadget,
blank=True, null=True)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Many-to-Many Relations
class Thingy(models.Model):
...
class Gizmo(models.Model):
thingies = models.ManyToManyField(Thingy)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Saving a Model Object
thingy = Thingy()
thingy.size = 'big'
thingy.save()
gadget = Gadget(thingy=thingy)
gadget.save()
gizmo = Gizmo(thingies=[thingy])
gizmo.save()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 11
• Create new model classes • All should have a name, up
for foreign keys: to 255 characters
django.contrib.auth.models. Middleware
• Time Slot User for talk speakers URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex11
www.EngineeringBooksPdf.com
Meanwhile, in the admin app...
www.EngineeringBooksPdf.com
Changing Existing Models
• Adding/removing/changing fields in a
model requires a schema migration
• Django doesn’t support it out of the box
• Pro mode: use South
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Cheesy Precompiler Way
$ ./manage.py dbshell
$ ./manage.py syncdb
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Querying the Model
all_thingies = Thingy.objects.all()
single_thingy = Thingy.objects.get(id=1)
big_thingies = Thingy.objects.filter(size='big')
ordered_thingies = Thingy.objects.all().order_by('size')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Relations in Templates
• When a model object retrieved from the
ORM has relations, you get a relation
manager and not an actual iterable
collection
• Need to call .all() (or get or filter) on it
before you get back the related model
objects Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Relations in Templates
{% for gizmo in gizmos %}
{% for thingy in gizmo.thingies.all %}
...
{% endfor %}
{% endfor %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 12
• Create a view and template to display a list
of all talks, ordered by title
• Be sure to display all of the talk speakers
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex12
www.EngineeringBooksPdf.com
Optimizing Queries
• What we just did will make lots of extra
database queries (because of the loops)
• Go read up on:
• select_related: does a join in SQL
• prefetch_related: queries in advance, caches
results, allows “join” in Python
www.EngineeringBooksPdf.com
Model Managers
• A place to encapsulate data queries
• Extend to provide extra queries with
developer-friendly interfaces
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Model Managers
class ThingyManager(models.Manager):
def big_ones(self):
return self.get_query_set().filter(size='big')
class Thingy(models.Model):
Framework
objects = ThingyManager()
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Using a Model Manager
big_thingies = Thingy.objects.big_ones()
green_thingies = Thingy.objects.of_color('green')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 13
• Move the queries from the previous exercise
into a TalkManager
• Change the queries to only get talks that
have been approved
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex13
www.EngineeringBooksPdf.com
Generic Views
• Many views fall into the same patterns
• Django provides generic view classes for
things like showing a list of objects, creating
an object, updating an object, deleting, etc.
• Subclass and set properties or override
certain methods to customize Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic List Views
from django.views.generic import ListView
class ThingyListView(ListView):
queryset = Thingy.objects.all()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic List View URLs
from django.conf.urls import patterns, include, url
from myapp.views import ThingyListView
urlpatterns = patterns('myapp.views',
...
url(r'^$', ThingyListView.as_view(), name='things')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic List View Templates
• Generic List Views are automatically wired
to templates
• Naming convention: lowercase model
name + “_list.html”, eg:
templates/myapp/thingy_list.html
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 14
• Replace the view that lists talks with a
generic list view
• Redo the URL mapping to use your new
generic list view subclass
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex14
www.EngineeringBooksPdf.com
Can You Guess What’s Next?
• Need to create new talks
• We could do it the hard way...
• Make a Form
• Make a View
• Read validated data, put it into a model object
Framework
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Model Forms
from django import forms
from myapp.models import Thingy
class ThingyForm(forms.ModelForm):
class Meta:
model = Thingy
exclude = ('flavor', 'user')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic Create Views
from django.views.generic.edit import CreateView
from myapp.forms import ThingyForm
class ThingyCreationView(CreateView):
model = Thingy
form_class = ThingyForm
success_url = "/accounts/profile"
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic Create View Templates
• Generic Create Views are automatically
wired to templates
• Naming convention: lowercase model
name + “_form.html”; eg:
templates/myapp/thingy_form.html
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 15
• Make a Generic Create • Be sure to connect a
View and Model Form to “create” URL to the new
submit new talk Generic Create View
proposals
• Don’t forget a template!
• Exclude approval status,
location, and time slot • Link to the create form
(since the speaker from user profile
doesn’t control them)
• List user’s submitted Framework
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex15
www.EngineeringBooksPdf.com
Generic Edit Views
from django.shortcuts import resolve_url
from django.view.generic.edit import UpdateView
class ThingyUpdateView(UpdateView):
form_class = ThingyForm
queryset = Thingy.objects.all()
def get_success_url(self):
return resolve_url('myapp:thingy')
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Generic Edit View URLs
from django.conf.urls import patterns, include, url
from myapp.views import ThingyUpdateView
urlpatterns = patterns('myapp.views',
...
url(r'(?P<pk>[0-9]+)$', ThingyUpdateView.as_view(),
name='update'),
)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 16
• Create a Generic Edit View for talks
• Use the Model Form from the previous
exercise
• Be sure to wire it to a URL for editing
• Change the existing template to indicate
whether we’re editing or creating Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex16
www.EngineeringBooksPdf.com
Security in Views
• Can you spot a security problem in the
previous exercise?
• Anyone can edit any talk!
• Generic views can restrict access by limiting
the queryset available in the view
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Restricting Object Access
# In models.py...
class ThingyManager(models.Manager):
# In views.py...
class ThingyUpdateView(UpdateView):
def get_queryset(self):
Framework
return Thingy.objects.for_user(
Middleware
self.request.user)
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 17
• Lock down the update view from the
previous exercise so that a talk may only be
edited by its speakers
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex17
www.EngineeringBooksPdf.com
Read-Only Data in Generic Edit Views
• Model Form automatically builds form
elements for everything in the model
• Model Form excludes anything that it was
told to exclude
• Excluded fields are still available as
attributes of a variable called “object” (the Framework
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Read-Only Data in Generic Edit Views
<form ...>
{% csrf_token %}
{{ form.as_p }}
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 18
• Change the talk form from the previous
exercises
• Show time slot, location, and approval
status without allowing them to be modified
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex18
www.EngineeringBooksPdf.com
Requiring Login
from django.contrib.auth.decorators import \
login_required
@login_required
def my_login_only_view(request):
return render(request, "myapp/my_view.html")
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 19
• Require login on the user profile page
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex19
www.EngineeringBooksPdf.com
Custom Template Filters
• Django comes with many filters
• You can add your own
• Function that accepts a value and returns a
string
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Defining a Custom Filter
# In myapp/templatetags/myfilters.py...
register = template.Library()
@register.filter
def my_filter(value):
... Framework
return format_html("...")
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Using a Custom Filter
{% load myfilters %}
{% block content %}
{% endblock %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Exercise 20
• Create a custom filter function
“boolean_icon” that will show one image if
a value is True and another if it’s False
• Use the boolean_icon in the user’s profile to
indicate whether a talk has been approved
• Use static icons from the admin site: Framework
from django.contrib.admin.templatetags.admin_static import static
Middleware
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
Let’s see the code!
git reset --hard ex20
www.EngineeringBooksPdf.com
Bonus Exercises
• Show talks by time slot and/or location
• Blog; include RSS feed
• Sponsorship; include sponsor image upload
and display
• Enhance user profiles; include image
upload, default to Gravatar Framework
Middleware
Views
Tem-
Models
plates
Tags &
DB
Filters
www.EngineeringBooksPdf.com
A Little Bit About Deployment
www.EngineeringBooksPdf.com
Django
www.EngineeringBooksPdf.com
Varnish
Nginx
Django
Django
Django
www.EngineeringBooksPdf.com
Where to Deploy
• Gondor.io
• Heroku
• Webfaction
• Google App Engine
(if that’s what you’re into)
• Your favorite VPS (Rackspace, AWS, etc.)
www.EngineeringBooksPdf.com
Questions?
www.EngineeringBooksPdf.com
Links
• http://python.org
• https://djangoproject.com
• https://github.com/finiteloopsoware/
django-precompiler
www.EngineeringBooksPdf.com
Credits
• Image from Django Unchained by Sony
Pictures
http://www.nydailynews.com/entertainment/tv-movies/django-star-foxx-life-
built-race-article-1.1220275
www.EngineeringBooksPdf.com
Contact Information
Mike Crute David Stanek
Finite Loop Soware American Greetings
http://mike.crute.org http://traceback.org
@mcrute @dstanek
Mike Pirnat
American Greetings
http://mike.pirnat.com
@mpirnat
www.EngineeringBooksPdf.com
Thanks for coming
& happy hacking!
www.EngineeringBooksPdf.com