Upload
jason-davies
View
23.224
Download
0
Embed Size (px)
Citation preview
An Introduction
Jason DaviesPyCon UK 2007
Django Reinhardt
ljworld.com
www.djangoproject.com
Overview of this Tutorial
➔Brief introduction and philosophy➔Creating Django models➔The automatic admin interface➔Views (and URLs)➔Templates➔Comparison with other frameworks
Django's Mission Statement
“Django is a high-level Python web framework that encourages rapid
development and clean, pragmatic design.”
Django Requirements
➔Python (2.3+)➔PostgreSQL / MySQL / SQLite / ...➔Apache + mod_python / FastCGI / ...
“Projects”
$ django-admin.py startproject myproject$ django-admin.py startproject myproject
myproject/myproject/ __init__.py__init__.py manage.pymanage.py settings.pysettings.py urls.pyurls.py
$ ./manage.py runserver$ ./manage.py runserverValidating models...0 errors found.
Django version 0.96-pre, using settings 'myproject.settings'Development server is running at http://127.0.0.1:8000/Quit the server with CONTROL-C.
“Apps”
$ django-admin.py startapp blog$ django-admin.py startapp blog
myproject/ blog/ __init__.py models.py views.py __init__.py manage.py settings.py urls.py
Creating Models
from django.db import modelsfrom django.db import models
class Blog(models.Model):class Blog(models.Model): title = models.CharField(maxlength=200)title = models.CharField(maxlength=200)
class Post(models.Model):class Post(models.Model): title = models.CharField(maxlength=200)title = models.CharField(maxlength=200) body = models.TextField()body = models.TextField() blog = models.ForeignKey(Blog)blog = models.ForeignKey(Blog) pub_date = models.DateTimeField()pub_date = models.DateTimeField()
Activating Models
$ ./manage.py syncdbCreating table blog_blogCreating table blog_postLoading 'initial_data' fixtures...No fixtures found.
Activating the Admin Interfacefrom django.db import modelsfrom django.db import models
class Blog(models.Model):class Blog(models.Model): title = models.CharField(maxlength=200)title = models.CharField(maxlength=200)
class Admin:class Admin: list_display = ['title']list_display = ['title']
class Post(models.Model):class Post(models.Model): title = models.CharField(maxlength=200)title = models.CharField(maxlength=200) body = models.TextField()body = models.TextField() blog = models.ForeignKey(Blog)blog = models.ForeignKey(Blog) pub_date = models.DateTimeField()pub_date = models.DateTimeField()
class Admin:class Admin: list_display = ['title', 'pub_date']list_display = ['title', 'pub_date']
Model API
$ ./manage.py shell
>>> from myproject.blog import Blog>>> b = Blog(... title=”Jason's Fantastic Blog!!!”)>>> b.save()
>>> all_blogs = Blog.objects.all()>>> all_blogs = Blog.objects.all()>>> print all_blogs>>> print all_blogs[<Blog: Blog object>][<Blog: Blog object>]
>>> print all_blogs.name>>> print all_blogs.nameJason's Fantastic Blog!!!Jason's Fantastic Blog!!!
>>> b = Blog.objects.get(name__contains='Jason')>>> b = Blog.objects.get(name__contains='Jason')>>> print b.title>>> print b.titleJason's Fantastic Blog!!!Jason's Fantastic Blog!!!
URLs
ROOT_URLCONF = 'myproject.urls'ROOT_URLCONF = 'myproject.urls'
URLconfs
from django.conf.urls.defaults import *from django.conf.urls.defaults import *from myproject.blog.views import *from myproject.blog.views import *
urlpatterns = patterns('',urlpatterns = patterns('', (r'^admin/', include('django.contrib.admin.urls')),(r'^admin/', include('django.contrib.admin.urls')),
(r'^blog/$', post_list),(r'^blog/$', post_list), (r'^blog/(?P<id>\d+)/$', post_list),(r'^blog/(?P<id>\d+)/$', post_list),
))
Views
from django.http import HttpResponsefrom django.http import HttpResponse
def post_list(request):def post_list(request): return HttpReponse(“This is a list of posts!”)return HttpReponse(“This is a list of posts!”)
from django.http import HttpResponsefrom django.http import HttpResponsefrom myproject.blog.models import Postfrom myproject.blog.models import Post
def post_list(request):def post_list(request): r = “<ul>”r = “<ul>” posts = Post.objects.order_by(“-pub_date”)posts = Post.objects.order_by(“-pub_date”) for post in posts:for post in posts: r += “<li>%s: %s</li>” % (post.title, post.body)r += “<li>%s: %s</li>” % (post.title, post.body) r += “</ul>”r += “</ul>” return HttpResponse(r)return HttpResponse(r)
More realistic...
from django.shorcuts import render_to_responsefrom django.shorcuts import render_to_responsefrom myproject.blog.models import Postfrom myproject.blog.models import Post
def post_list(request):def post_list(request): posts = Post.objects.order_by(“-pub_date”)posts = Post.objects.order_by(“-pub_date”) return render_to_response('blog/post_list.html', {return render_to_response('blog/post_list.html', { 'post_list': posts,'post_list': posts, })})
Better!
from django.shorcuts import render_to_responsefrom django.shorcuts import render_to_responsefrom myproject.blog.models import Postfrom myproject.blog.models import Post
def post_detail(request, id):def post_detail(request, id): post = get_object_or_404(Post, id=id)post = get_object_or_404(Post, id=id) return render_to_response('blog/post_detail.html', {return render_to_response('blog/post_detail.html', { 'post': post,'post': post, })})
For completeness...
Templates
<html> <body> <h1>Jason's Fantastic Blog!!!</h1> <ul> {% for p in post_list %} <li> <a href=”{{ p.id }}/”>{{ p.title|escape }}</a> </li> {% endfor %} </ul> </body></html>
The magic dot
➔p[“name”]➔p.name➔p.name()
Filters
{{ var|escape|linebreaks|... }}
base.html
<html> <head> <title>{% block title %}{% endblock %} </head> <body> <div id=”content”> {% block content %}{% endblock %} </div> <div id=”footer”> {% block footer %} Copyright Jason Davies 2007. {% endblock %} </div> </body></html>
{% extends “base.html” %}
{% block title %} Posts | {{ block.super }}{% endblock %}
{% block content %} <h1>Blog Posts ({{ post_list|length }} total)</h1> <ul> {% for post in post_list %} <li> <a href=”{{ post.id }}/”> {{ post.title|escape }} </a> </li> {% endfor %} </ul>{% endblock %}
http://www.alrond.com/en/2007/jan/25/performance-test-of-6-leading-frameworks/
http://www.mercurytide.co.uk/whitepapers/django-cheat-sheet/