Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
220 views

Web Development With Python and Django New

This document provides an overview of setting up a Python and Django development environment. It discusses installing portable versions of Python and Git for Windows, setting the PATH variable, creating a virtual environment, installing Django and other requirements via pip, and starting a new Django project called "codesmash". The goal is to iteratively build a full-featured website for a fictional software conference called Code Smash.

Uploaded by

Rahul Sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
220 views

Web Development With Python and Django New

This document provides an overview of setting up a Python and Django development environment. It discusses installing portable versions of Python and Git for Windows, setting the PATH variable, creating a virtual environment, installing Django and other requirements via pip, and starting a new Django project called "codesmash". The goal is to iteratively build a full-featured website for a fictional software conference called Code Smash.

Uploaded by

Rahul Sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 192

Web Development with

Python and Django


Mike Crute • Mike Pirnat • David Stanek

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/finiteloopsoware/
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()

"{0}: {1}".format("foo", "bar")

"{foo}: {bar}".format(foo=42, bar=1138)

len("foo")

www.EngineeringBooksPdf.com
Numeric Types
42

42.0

42L

www.EngineeringBooksPdf.com
Lists, Tuples, and Sets
['a', 'b', 'c']

('Rush', '2112', 5.0)

set(['a', 'b', 'c'])

www.EngineeringBooksPdf.com
Sequence Operations
[...][0]

[...][-1]

[...][:1] # same as [...][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

foo is not 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

def foo(bar, baz='quux'):


return (bar, baz)

def foo(*args, **kwargs):


return (args, kwargs)

www.EngineeringBooksPdf.com
Decorators
@bar
def foo():
return 42

@baz('xyzzy')
def quux():
return 42

www.EngineeringBooksPdf.com
Classes
class Foo(object):

def __init__(self, bar):


self.bar = bar

www.EngineeringBooksPdf.com
Docstrings
"Modules can have docstrings."

class Foo(object):
"Classes can have docstrings too."

def __init__(self, bar):


"So can functions/methods."

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

from datetime import timedelta

from decimal import Decimal as D

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

• Run the .EXE


• Install into c:\django-precompiler
• Download won't work?
p://p.codemash.org/webdev_with_django

www.EngineeringBooksPdf.com
Portable Git
• Download http://bit.ly/X4dGps
http://msysgit.googlecode.com/files/Git-1.8.0-preview20121022.exe

• Create a new folder


• Extract archive into a new folder:
c:\django-precompiler\Portable Git
1.8.0-preview20121022
• Download won't work?
p://p.codemash.org/webdev_with_django

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

> python virtualenv django-precompiler


> cd django-precompiler
> Scripts/activate.bat

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 soware
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

$ git reset --hard ex00

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.

$ django-admin.py startproject codesmash ./


$ python manage.py runserver

# Windows

> python Scripts/django-admin.py startproject codesmash


> python manage.py runserver

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

• Update settings to tell Django where to find


the templates
• Put an HTML file in the templates directory
Framework

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 oen 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

> python Scripts/django-admin.py startapp myapp Framework

Middleware

• Add it to INSTALLED_APPS in settings.py URLs

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

urls.py <-- you'll want to make one of these


forms.py <-- one of these too
Framework

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

return render(request, 'myapp/myform.html', {


'form': form
Framework
})
Middleware

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>

<form action="{% url 'myapp:my_form' %}"


method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Go!</button>
</form>
Framework
</body>
Middleware
</html>
URLs

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'

• Import and use


from django.core.mail import send_mail

send_mail('subject', 'message', 'sender',


['recipient', ...]) Framework

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 title %}Hello, World{% endblock %}

{% 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 Aer 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

• Set up a UserCreationForm • Set up templates for the


subclass in accounts.forms form and profile page in
with username and email templates/accounts/

• Set up a view that displays • Wire up the URLs (be sure to


the form on GET give them names)

• 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

• Let’s enable it now! URLs

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

• outline - text outlining the talk Middleware

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

• Category • All should have a __str__;


Time Slot’s should use
• Talk Type strime (see strime.net)

• Audience Skill Level • Location and Time Slot


should be optional
• Location
• Do a many-to-many on Framework

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

> DROP TABLE talks;

$ ./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')

def of_color(self, color):


return self.get_query_set().filter(color=color)

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

• Save the model, redirect... Middleware

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

talks on user profile Middleware

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

from myapp.forms import ThingyForm

class ThingyUpdateView(UpdateView):

form_class = ThingyForm
queryset = Thingy.objects.all()

def get_success_url(self):
return resolve_url('myapp:thingy')

def get_context_data(self, **kwargs): Framework


context = super(ThingyUpdateView, self).get_context_data(**kwargs)
context['editing'] = True Middleware

return context URLs

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

def for_user(self, user):


return self.get_query_set().filter(user=user)

# 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

object being displayed/edited) Middleware

URLs

Views

Tem-
Models
plates

Tags &
DB
Filters

www.EngineeringBooksPdf.com
Read-Only Data in Generic Edit Views
<form ...>
{% csrf_token %}

{{ form.as_p }}

<p><input type="text" id="flavor"


value="{{ object.flavor }}" disabled ></p>

<input type="submit" value="Save Changes">


</form>
Framework

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

from django import template


from django.utils.html import format_html

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

<p>{{ foo|my_filter }}</p>


<p>{{ bar }}</p>

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

icon_url = static('admin/img/icon-{0}.gif'.format( URLs


{True: 'yes', False: 'no', None: 'unknown'}[value])
Views

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

• Room swap/ticket swap URLs

Views

Tem-
Models
plates

Tags &
DB
Filters

www.EngineeringBooksPdf.com
A Little Bit About Deployment

www.EngineeringBooksPdf.com
Django

www.EngineeringBooksPdf.com
Varnish

Nginx

Static Files Gunicorn

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/finiteloopsoware/
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

• Image of Django Reinhardt by ~Raimondsy


http://raimondsy.deviantart.com/art/Django-Reinhardt-314914547

• Other images from ClipArt Etc.


http://etc.usf.edu/clipart/

www.EngineeringBooksPdf.com
Contact Information
Mike Crute David Stanek
Finite Loop Soware 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

You might also like