Introduction to DjangoJacob Kaplan-MossStrange Loop 2011http://lanyrd.com/sfypm
Django TrainingPart 1: Introduction to Django.
“Django is a high-levelPython web framework that encourages rapiddevelopment and clean,                     ”   pragmatic ...
“Django is a high-levelPython web framework that encourages rapiddevelopment and clean,                     ”   pragmatic ...
“Django is a high-levelPython web framework that encourages rapiddevelopment and clean,                     ”   pragmatic ...
“Django is a high-levelPython web framework that encourages rapiddevelopment and clean,                     ”   pragmatic ...
Documentation           http://django.me/designhttp://www.djangobook.com/en/2.0/chapter01/                                ...
Which Django version   should I use?                       7
Installing Django• Download and run http://bit.ly/dsetup (http://python-­‐distribute.org/distribute_setup.py)• easy_instal...
“Projects”             9
$  django-­‐admin.py  startproject  yabl                                           10
yabl/   __init__.py   manage.py   settings.py   urls.py                 11
$  python  manage.py  runserverValidating  models...0  errors  found.Django  version  1.1  beta  1  SVN-­‐10844,  using  s...
13
Project settings• DATABASE_ENGINE• DATABASE_NAME• DATABASE_USER• DATABASE_PASSWORD• DATABASE_HOST                      14
$  python  manage.py  syncdbCreating  table  auth_permissionCreating  table  auth_groupCreating  table  auth_userCreating ...
Documentationhttp://django.me/about-settings    http://django.me/settings  http://django.me/manage.py                     ...
Exercise:  “it worked!”                 17
Django TrainingPart 2: Apps, models, and the admin
“Apps”         2
“Models”           3
What’s a model?                  4
MVC?(Model-View-Controller)                          5
CREATE  TABLE  "entries_entry"  (        "id"  integer  NOT  NULL  PRIMARY  KEY,        "author_id"  integer  NOT  NULL,  ...
Scary Quirky Language• SQL is tough• SQL knows no version control• DRY• Python is fun!                                 7
import  datetimefrom  django.db  import  modelsfrom  yabl.authors.models  import  Authorclass  Entry(models.Model):       ...
Defining Models                 9
$  python  manage.py  startapp  authors                                          10
authors/   __init__.py   models.py   tests.py   views.py                 11
INSTALLED_APPS  =  (        "django.contrib.auth",        "django.contrib.contenttypes",        "django.contrib.sessions",...
from  django.db  import  modelsclass  Author(models.Model):        first_name    =  models.CharField(max_length=200)      ...
$  python  manage.py  validate0  errors  found.                                 14
$  python  manage.py  sqlall  authorsBEGIN;CREATE  TABLE  "authors_author"  (        "id"  integer  NOT  NULL  PRIMARY  KE...
$  python  manage.py  syncdbCreating  table  authors_authorInstalling  index  for  authors.Author  model                  ...
$  python  manage.py  shell[1]  >>>  from  yabl.authors.models  import  Author[2]  >>>  a  =  Author(first_name="John",  l...
[4]  >>>  Author.objects.all()[4]      :  [<Author:  Author  object>][5]  >>>  Author.objects.create(first_name=Miguel,  l...
Model metadata                 19
class  Author(models.Model):        first_name    =  models.CharField(max_length=200)        last_name      =  models.Char...
class  Author(models.Model):        …        class  Meta:                verbose_name_plural  =  authors                or...
[1]  >>>  from  yabl.authors.models  import  Author[2]  >>>  Author.objects.all()[2]      :  [<Author:  John  Barth>,  <Au...
Documentation          http://django.me/modelshttp://www.djangobook.com/en/2.0/chapter05/                                 ...
Exercise:            Write some apps and some models:• Author (authors app)       • Entry (entries app)  • first_name (Char...
Django’sadmin interface                  25
“ A Web-based interface,   limited to trusted siteadministrators, that enables  the adding, editing and                   ...
from  django.contrib  import  adminfrom  yabl.authors.models  import  Authoradmin.site.register(Author)                   ...
INSTALLED_APPS  =  (        django.contrib.auth,        django.contrib.contenttypes,        django.contrib.sessions,      ...
$  python  manage.py  syncdbCreating  table  django_admin_logInstalling  index  for  admin.LogEntry  model                ...
from  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  django.contrib...
31
32
33
34
from  django.contrib  import  adminfrom  yabl.authors.models  import  Authorclass  AuthorAdmin(admin.ModelAdmin):        p...
Documentationhttp://djangobook.com/en/2.0/chapter06/          http://django.me/admin                                      ...
Exercise:            37
Django TrainingPart 3: URLs, views, and templates
Views        2
What’s a view?                 3
4
URLs       5
page.phpscript.cgi?pageid=144   StoryPage.aspx                        6
0,2097,1-1-30-72-407-4752,00.html                                    7
/authors//authors/jacob//authors/adrian/                   8
ROOT_URLCONF  =  "yabl.urls"                               9
yabl/urls.pyfrom  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  dj...
yabl/authors/urls.pyfrom  django.conf.urls.defaults  import  *urlpatterns  =  patterns(,        (r^$,                  yab...
yabl/urls.pyfrom  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  dj...
Regex crash coursea                    The letter “a”.a+                   One or more “a”s.b?                   Zero or o...
Dissecting a request• GET  /authors/1/• ROOT_URLCONF• yabl.urls• (r^authors/,  include(yabl.authors.urls))• yabl.authors.u...
Documentation  http://django.me/urls                          15
A first view              16
yabl/authors/views.pyfrom  django.http  import  HttpResponsedef  author_list(request):        return  HttpResponse("This  ...
yabl/authors/views.pyfrom  django.http  import  HttpResponsefrom  yabl.authors.models  import  Authordef  author_list(requ...
yabl/authors/views.pyfrom  django  import  templatefrom  django.http  import  HttpResponsefrom  yabl.authors.models  impor...
yabl/authors/views.pyfrom  django.shortcuts  import  renderfrom  yabl.authors.models  import  Authordef  author_list(reque...
yabl/authors/views.pyfrom  django.http  import  Http404from  django.shortcuts  import  render_to_responsefrom  yabl.author...
yabl/authors/views.pyfrom  django.shortcuts  import  render_to_response,  get_object_or_404from  yabl.authors.models  impo...
Templates            23
What’s a template?                     24
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body>   <h1>...
Where to templates go?• In an app’s templates directory.• In directories specified by  settings.TEMPLATE_DIRS.• ...        ...
TEMPLATE_DIRS  =  [        /path/to/some/templates/,        /path/to/some/more/other/templates/,]                         ...
TEMPLATE_DIRS  =  [        /Users/jacob/Projects/stl-­‐django/yabl/templates/,]                                           ...
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body>   <h1>...
The magic dot• a["name"]• a.name• a.name()                30
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body>   <h1>...
{{  text|escape|linkbreaks  }}                                 32
{{  text|truncatewords:"30"  }}                                  33
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body>   <h1>...
Template inheritance                       35
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head>   <title>      {%  block  title  %}YABL{%...
<!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head>   <title>      {%  block  title  %}YABL{%...
{%  extends  "base.html"  %}{%  block  title  %}    Authors  |  {{  block.super  }}{%  endblock  %}{%  block  content  %} ...
!                                 "                                                                        93&45;!"#$%&$()...
Why?       40
Inheritance tips• {% extends %} must be the first thing in  your template.• More {% block %}s are better.• If you’re duplic...
Documentationhttp://djangobook.com/en/2.0/chapter04/        http://django.me/templates                                    ...
Exercise:   /authors/ /authors/{id}/    /entries/ /entries/{slug}/                    43
Django trainingBONUS: Models and queries
Terminology              2
Modelsa.k.a. “DDL”               3
Managers a.k.a. “table”                  4
QuerySets a.k.a. “selection”                      5
Model instances     a.k.a. “row”                    6
!!!"!"#$#%&()*+,-./"*012.(31"456,21"7.8$9(6.:!!!"!"#$%&()*"+,&"-./0"123!4"$%&()*"523"-./0"6,&!7!!!".#$#!";<=!!!".$%&()*"+,...
Models         8
Instance methodsclass  Entry(models.Model):        …        def  is_by_jacob(self):                return  "jacob"  in  se...
“Special” instance methods                             10
__unicode__class  Entry(models.Model):        …        def  __unicode__(self):                return  self.headline…[1]  >...
saveclass  Entry(models.Model):        …        def  save(self,  **kwargs):                self.word_count  =  count_words...
saveclass  Entry(models.Model):        …        def  save(self,  **kwargs):                self.word_count  =  count_words...
deleteclass  Author(models.Model):        …        def  delete(self):                nobody  =  Author.objects.get(first_n...
Managers           15
Default managerclass  Entry(models.Model):        …        objects  =  models.Manager()…[1]  >>>  from  yabl.entries.model...
Custom managersclass  EntryManager(models.Manager):        def  future(self):                …        def  past(self):    ...
[1]  >>>  from  yabl.entries.models  import  Entry[2]  >>>  Entry.objects.future()[2]      :  [<Entry:  Hi>][3]  >>>  Entr...
Documentation http://django.me/managers                             19
QuerySets            20
Filters[1]  >>>  Author.objects.filter(first_name=Jacob)[1]      :  [<Author:  Jacob  Kaplan-­‐Moss>][2]  >>>  Author.obje...
Field lookupsexact,  iexact                  name__exact=Joecontains,  icontains            name__icontains=sstartswith,  ...
Following relationships[1]  >>>  Entry.objects.filter(author__first_name__startswith=J)[1]      :  [<Entry:  Hi>][2]  >>> ...
related_nameclass  Entry(models.Model):        author  =  models.ForeignKey(Author,  related_name=entries)                ...
select_related()[1]  >>>  e  =  Entry.objects.get(pk=1)[2]  >>>  e.author[2]      :  <Author:  Jacob  Kaplan-­‐Moss>Oops, ...
Limiting select_related()[1]  >>>  Entry.objects.select_related(author,  category)[2]  >>>  Entry.objects.select_related(d...
QuerySet details                   27
QuerySets are chainable[1]  >>>  Entry.objects.filter(    ....:          headline__contains=bites,    ....:  ).exclude(   ...
QuerySets are unique[1]  >>>  qs1  =  Entry.objects.filter(headline__icontains=dog)[2]  >>>  qs2  =  qs1.exclude(pub_date_...
QuerySets are lazy[1]  >>>  qs  =  Entry.objects.filter(headline__icontains=dog)[2]  >>>  qs  =  qs.exclude(pub_date__year...
When QuerySets are evaluated• Iteration   for  i  in  qs• Slicing     qs[0:5]• Printing    print  qs,  str(qs)• len()     ...
Chainable methodsfilter(),  exclude()       qs.filter(name=Joe)order_by()                 qs.order_by(-­‐first_name)revers...
Other QuerySet methodsget()             e  =  Entry.objects.get(…)create()          e  =  Entry.objects.create(…)get_or_cr...
Raw SQL[1]  >>>  query  =  "SELECT  *  FROM  authors_author  WHERE  first_name  =  %s"[2]  >>>  params  =  ["Jacob"][3]  >...
Entry.objects.raw(query  %  params)        No!                           35
Other topics               36
Aggregationhttp://jacobian.org/r/django-aggregation                                           37
Transaction control http://jacobian.org/r/django-transactions                                             38
Exercise: /entries/future/  /entries/past/                    39
What else?• Forms, model forms, form sets, ...• File storage - local and remote.• Cookies, sessions, authn/authz.• GeoDjan...
Thank you! jacob@jacobian.orghttp://lanyrd.com/sfypm                          2
Upcoming SlideShare
Loading in...5
×

Introduction To Django (Strange Loop 2011)

20,956

Published on

Published in: Technology, Art & Photos
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
20,956
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
106
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Introduction To Django (Strange Loop 2011)

  1. 1. Introduction to DjangoJacob Kaplan-MossStrange Loop 2011http://lanyrd.com/sfypm
  2. 2. Django TrainingPart 1: Introduction to Django.
  3. 3. “Django is a high-levelPython web framework that encourages rapiddevelopment and clean, ” pragmatic design. 2
  4. 4. “Django is a high-levelPython web framework that encourages rapiddevelopment and clean, ” pragmatic design. 3
  5. 5. “Django is a high-levelPython web framework that encourages rapiddevelopment and clean, ” pragmatic design. 4
  6. 6. “Django is a high-levelPython web framework that encourages rapiddevelopment and clean, ” pragmatic design. 5
  7. 7. Documentation http://django.me/designhttp://www.djangobook.com/en/2.0/chapter01/ 6
  8. 8. Which Django version should I use? 7
  9. 9. Installing Django• Download and run http://bit.ly/dsetup (http://python-­‐distribute.org/distribute_setup.py)• easy_install  Django• Later: learn about pip and virtualenv http://pip.rtfd.org/ http://virtualenv.rtfd.org/ 8
  10. 10. “Projects” 9
  11. 11. $  django-­‐admin.py  startproject  yabl 10
  12. 12. yabl/ __init__.py manage.py settings.py urls.py 11
  13. 13. $  python  manage.py  runserverValidating  models...0  errors  found.Django  version  1.1  beta  1  SVN-­‐10844,  using  settings  yabl.settingsDevelopment  server  is  running  at  http://127.0.0.1:8000/Quit  the  server  with  CONTROL-­‐C. 12
  14. 14. 13
  15. 15. Project settings• DATABASE_ENGINE• DATABASE_NAME• DATABASE_USER• DATABASE_PASSWORD• DATABASE_HOST 14
  16. 16. $  python  manage.py  syncdbCreating  table  auth_permissionCreating  table  auth_groupCreating  table  auth_userCreating  table  auth_messageCreating  table  django_content_typeCreating  table  django_sessionCreating  table  django_siteYou  just  installed  Djangos  auth  system,  which  means  you  dont  have  any  superusers  defined.Would  you  like  to  create  one  now?  (yes/no):  yesUsername  (Leave  blank  to  use  jacob):  jacobE-­‐mail  address:  jacob@jacobian.orgPassword:  Password  (again):  Superuser  created  successfully.Installing  index  for  auth.Permission  modelInstalling  index  for  auth.Message  model 15
  17. 17. Documentationhttp://django.me/about-settings http://django.me/settings http://django.me/manage.py 16
  18. 18. Exercise: “it worked!” 17
  19. 19. Django TrainingPart 2: Apps, models, and the admin
  20. 20. “Apps” 2
  21. 21. “Models” 3
  22. 22. What’s a model? 4
  23. 23. MVC?(Model-View-Controller) 5
  24. 24. CREATE  TABLE  "entries_entry"  (        "id"  integer  NOT  NULL  PRIMARY  KEY,        "author_id"  integer  NOT  NULL,        "pub_date"  datetime  NOT  NULL,        "headline"  varchar(200)  NOT  NULL,        "slug"  varchar(50)  NOT  NULL  UNIQUE,        "summary"  text  NOT  NULL,        "body"  text  NOT  NULL) 6
  25. 25. Scary Quirky Language• SQL is tough• SQL knows no version control• DRY• Python is fun! 7
  26. 26. import  datetimefrom  django.db  import  modelsfrom  yabl.authors.models  import  Authorclass  Entry(models.Model):        author              =  models.ForeignKey(Author,  related_name=entries)        pub_date          =  models.DateTimeField(default=datetime.datetime.now)        headline          =  models.CharField(max_length=200)        slug                  =  models.SlugField(unique=True)        summary            =  models.TextField()        body                  =  models.TextField() 8
  27. 27. Defining Models 9
  28. 28. $  python  manage.py  startapp  authors 10
  29. 29. authors/ __init__.py models.py tests.py views.py 11
  30. 30. INSTALLED_APPS  =  (        "django.contrib.auth",        "django.contrib.contenttypes",        "django.contrib.sessions",          "django.contrib.sites",        "yabl.authors",) 12
  31. 31. from  django.db  import  modelsclass  Author(models.Model):        first_name    =  models.CharField(max_length=200)        last_name      =  models.CharField(max_length=200)        bio                  =  models.TextField(blank=True) 13
  32. 32. $  python  manage.py  validate0  errors  found. 14
  33. 33. $  python  manage.py  sqlall  authorsBEGIN;CREATE  TABLE  "authors_author"  (        "id"  integer  NOT  NULL  PRIMARY  KEY,        "first_name"  varchar(200)  NOT  NULL,        "last_name"  varchar(200)  NOT  NULL,        "bio"  text  NOT  NULL);COMMIT; 15
  34. 34. $  python  manage.py  syncdbCreating  table  authors_authorInstalling  index  for  authors.Author  model 16
  35. 35. $  python  manage.py  shell[1]  >>>  from  yabl.authors.models  import  Author[2]  >>>  a  =  Author(first_name="John",  last_name="Barth")[3]  >>>  a.save() 17
  36. 36. [4]  >>>  Author.objects.all()[4]      :  [<Author:  Author  object>][5]  >>>  Author.objects.create(first_name=Miguel,  last_name=de  Cervantes)[5]      :  <Author:  Author  object>[6]  >>>  Author.objects.all()[6]      :  [<Author:  Author  object>,  <Author:  Author  object>][7]  >>>  al  =  Author.objects.filter(first_name=John)[8]  >>>  al[0].last_name[8]      :  uBarth[9]  >>>  Author.objects.get(last_name__startswith=de).first_name[9]      :  uMiguel 18
  37. 37. Model metadata 19
  38. 38. class  Author(models.Model):        first_name    =  models.CharField(max_length=200)        last_name      =  models.CharField(max_length=200)        bio                  =  models.TextField(blank=True)                def  __unicode__(self):                return  %s  %s  %  (self.first_name,  self.last_name) 20
  39. 39. class  Author(models.Model):        …        class  Meta:                verbose_name_plural  =  authors                ordering  =  [last_name,  first_name] 21
  40. 40. [1]  >>>  from  yabl.authors.models  import  Author[2]  >>>  Author.objects.all()[2]      :  [<Author:  John  Barth>,  <Author:  Miguel  de  Cervantes>][3]  >>>  Author.objects.order_by(-­‐first_name)[3]      :  [<Author:  Miguel  de  Cervantes>,  <Author:  John  Barth>] 22
  41. 41. Documentation http://django.me/modelshttp://www.djangobook.com/en/2.0/chapter05/ 23
  42. 42. Exercise: Write some apps and some models:• Author (authors app) • Entry (entries app) • first_name (CharField) • author (ForeignKey) • last_name (CharField) • pub_date (DateTimeField) • bio (TextField) • is_published (BooleanField) • headline (CharField) • slug (SlugField) • summary (TextField) • body (TextField) 24
  43. 43. Django’sadmin interface 25
  44. 44. “ A Web-based interface, limited to trusted siteadministrators, that enables the adding, editing and ” deletion of site content. — The Django Book http://djangobook.com/en/2.0/chapter06/ 26
  45. 45. from  django.contrib  import  adminfrom  yabl.authors.models  import  Authoradmin.site.register(Author) 27
  46. 46. INSTALLED_APPS  =  (        django.contrib.auth,        django.contrib.contenttypes,        django.contrib.sessions,        django.contrib.sites,        django.contrib.admin,        yabl.authors,        yabl.entries,) 28
  47. 47. $  python  manage.py  syncdbCreating  table  django_admin_logInstalling  index  for  admin.LogEntry  model 29
  48. 48. from  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  django.contrib  import  adminadmin.autodiscover()urlpatterns  =  patterns(,        #  Example:        #  (r^yabl/,  include(yabl.foo.urls)),        #  Uncomment  the  admin/doc  line  below  and  add  django.contrib.admindocs          #  to  INSTALLED_APPS  to  enable  admin  documentation:        #  (r^admin/doc/,  include(django.contrib.admindocs.urls)),        #  Uncomment  the  next  line  to  enable  the  admin:        (r^admin/,  include(admin.site.urls)),) 30
  49. 49. 31
  50. 50. 32
  51. 51. 33
  52. 52. 34
  53. 53. from  django.contrib  import  adminfrom  yabl.authors.models  import  Authorclass  AuthorAdmin(admin.ModelAdmin):        passadmin.site.register(Author,  AuthorAdmin) 35
  54. 54. Documentationhttp://djangobook.com/en/2.0/chapter06/ http://django.me/admin 36
  55. 55. Exercise: 37
  56. 56. Django TrainingPart 3: URLs, views, and templates
  57. 57. Views 2
  58. 58. What’s a view? 3
  59. 59. 4
  60. 60. URLs 5
  61. 61. page.phpscript.cgi?pageid=144 StoryPage.aspx 6
  62. 62. 0,2097,1-1-30-72-407-4752,00.html 7
  63. 63. /authors//authors/jacob//authors/adrian/ 8
  64. 64. ROOT_URLCONF  =  "yabl.urls" 9
  65. 65. yabl/urls.pyfrom  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  django.contrib  import  adminadmin.autodiscover()urlpatterns  =  patterns(,        (r^authors/$,                  yabl.authors.views.author_list),        (r^authors/(d+)/$,      yabl.authors.views.author_detail),        (r^admin/,  include(admin.site.urls)),) 10
  66. 66. yabl/authors/urls.pyfrom  django.conf.urls.defaults  import  *urlpatterns  =  patterns(,        (r^$,                  yabl.authors.views.author_list),        (r^(d+)/$,      yabl.authors.views.author_detail),) 11
  67. 67. yabl/urls.pyfrom  django.conf.urls.defaults  import  *#  Uncomment  the  next  two  lines  to  enable  the  admin:from  django.contrib  import  adminadmin.autodiscover()urlpatterns  =  patterns(,        (r^authors/,  include(yabl.authors.urls)),        (r^admin/,      include(admin.site.urls)),) 12
  68. 68. Regex crash coursea The letter “a”.a+ One or more “a”s.b? Zero or one “b”s.c{1,3} One, two, or three “c”s.. Any single character.[abc] Either an “a”, “b”, or “c”.[A-­‐Z] Any character between “A” and “Z”.[A-­‐Za-­‐z0-­‐9]? Zero or one letters “A-Z”, “a-z”, or “0-9”.(d{3,4}) A group containing three or four digits.(w*) A group containing zero or more word characters (letters/digits).[^/]+ One or more characters until (and not including) a forward slash.^(joe|bob) A string starting with “joe” or “bob”.(?P<id>d+) A group named “id” containing one or more digits.article/$ A string ending with “article/” 13
  69. 69. Dissecting a request• GET  /authors/1/• ROOT_URLCONF• yabl.urls• (r^authors/,  include(yabl.authors.urls))• yabl.authors.urls• (r^$,  author_list)                    (no match)• (r^(d+)/,  author_detail)      (match!)• author_detail(request,  1) 14
  70. 70. Documentation http://django.me/urls 15
  71. 71. A first view 16
  72. 72. yabl/authors/views.pyfrom  django.http  import  HttpResponsedef  author_list(request):        return  HttpResponse("This  is  the  author  list!") 17
  73. 73. yabl/authors/views.pyfrom  django.http  import  HttpResponsefrom  yabl.authors.models  import  Authordef  author_list(request):        r  =  "<ul>"        for  a  in  Author.objects.all():                r  +=  "<li>%s</li>"  %  a.name        r  +=  "</ul>"        return  HttpResponse(r) 18
  74. 74. yabl/authors/views.pyfrom  django  import  templatefrom  django.http  import  HttpResponsefrom  yabl.authors.models  import  Authordef  author_list(request):        as  =  Author.objects.all()        tmpl  =  template.loader.get_template("authors/index.html")        context  =  template.Context({"authors":  as})        return  HttpResponse(tmpl.render(context)) 19
  75. 75. yabl/authors/views.pyfrom  django.shortcuts  import  renderfrom  yabl.authors.models  import  Authordef  author_list(request):        context  =  {"authors"  :  Author.objects.all()}        return  render(request,  "authors/index.html",  context) 20
  76. 76. yabl/authors/views.pyfrom  django.http  import  Http404from  django.shortcuts  import  render_to_responsefrom  yabl.authors.models  import  Authordef  author_detail(request,  author_id):        try:                author  =  Author.objects.get(id=author_id)        except  Author.DoesNotExist:                raise  Http404()        return  render(request,  "authors/detail.html",  {"author"  :  author}) 21
  77. 77. yabl/authors/views.pyfrom  django.shortcuts  import  render_to_response,  get_object_or_404from  yabl.authors.models  import  Authordef  author_detail(request,  author_id):        author  =  get_object_or_404(Author,  id=author_id)        return  render(request,  "authors/detail.html",  {"author"  :  author}) 22
  78. 78. Templates 23
  79. 79. What’s a template? 24
  80. 80. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body> <h1>Authors  ({{  authors|length  }}  total)</h1> <ul> {%  for  a  in  authors  %} <li> <a  href="{{  a.id  }}/">{{  a.name  }}</a> </li> {%  endfor  %} </ul></body></html> 25
  81. 81. Where to templates go?• In an app’s templates directory.• In directories specified by settings.TEMPLATE_DIRS.• ... 26
  82. 82. TEMPLATE_DIRS  =  [        /path/to/some/templates/,        /path/to/some/more/other/templates/,] 27
  83. 83. TEMPLATE_DIRS  =  [        /Users/jacob/Projects/stl-­‐django/yabl/templates/,] 28
  84. 84. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body> <h1>Authors  ({{  authors|length  }}  total)</h1> <ul> {%  for  a  in  authors  %} <li> <a  href="{{  a.id  }}/">{{  a.name  }}</a> </li> {%  endfor  %} </ul></body></html> 29
  85. 85. The magic dot• a["name"]• a.name• a.name() 30
  86. 86. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body> <h1>Authors  ({{  authors|length  }}  total)</h1> <ul> {%  for  a  in  authors  %} <li> <a  href="{{  a.id  }}/">{{  a.name  }}</a> </li> {%  endfor  %} </ul></body></html> 31
  87. 87. {{  text|escape|linkbreaks  }} 32
  88. 88. {{  text|truncatewords:"30"  }} 33
  89. 89. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head><title>Authors</title></head><body> <h1>Authors  ({{  authors|length  }}  total)</h1> <ul> {%  for  a  in  authors  %} <li> <a  href="{{  a.id  }}/">{{  a.name  }}</a> </li> {%  endfor  %} </ul></body></html> 34
  90. 90. Template inheritance 35
  91. 91. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head> <title> {%  block  title  %}YABL{%  endblock  %} </title></head><body> <div  id="content"> {%  block  content  %}{%  endblock  %} </div> <div  id="footer"> {%  block  footer  %}Copyright  blah..{%  endblock  %} </div></body></html> 36
  92. 92. <!DOCTYPE  HTML  PUBLIC  "-­‐//W3C//DTD  HTML  4.01//EN"><html  lang="en"><head> <title> {%  block  title  %}YABL{%  endblock  %} </title></head><body> <div  id="content"> {%  block  content  %}{%  endblock  %} </div> <div  id="footer"> {%  block  footer  %}Copyright  blah..{%  endblock  %} </div></body></html> 37
  93. 93. {%  extends  "base.html"  %}{%  block  title  %} Authors  |  {{  block.super  }}{%  endblock  %}{%  block  content  %} <h1>Authors  ({{  authors|length  }}  total)</h1> <ul> {%  for  a  in  authors  %} <li> <a  href="{{  a.id  }}/">{{  a.name  }}</a> </li> {%  endfor  %} </ul>{%  endblock  %} 38
  94. 94. ! " 93&45;!"#$%&$()#*+,)$-.$$/0123&45*#"6 !"#$%&$()#*+,)$23&45*#"6 93$,(; ##9&0&5$;!"#+5718#&0&5$#"6##!!#)$1&072&0&5$#66 $ !"#+5718#&0&5$#"6 ##ABC7/5(2174 ####!"#+5718#&0&5$#"6!"#$(+5718#"6 ##9<&0&5$;!"#$(+5718#"6 !"#$(+5718#"6 9<3$,(; 9+7(>;!"#+5718#17&$&#"6 !"#+5718#/,05#"6 ##9(0G#0(H*/,05*;##93:;!!#)$1&072&0&5$#669<3:; ##9D5; ####!"#+5718#/,05#"6!"#$(+5718#"6##!"#=7/#)&7/>#0#)&7/>-50)&#"6 ####950;E74$9<50; ##9<(0G;####93?;!!#)&7/>23$,(50$#669<3?; ####950;A71,5#$F)9<50; ##9(0G#0(H*17&$&*;####9@;!!#)&7/>2&$,)$#66 ####222 ####!"#+5718#17&$&#"6!"#$(+5718#"6##!"#$(=7/#"6 ##9<D5; ##9<(0G;!"#$(+5718#"6 !"#$(+5718#"6 9<+7(>; section_index.html base_generic.html 9<3&45; base.html # 39
  95. 95. Why? 40
  96. 96. Inheritance tips• {% extends %} must be the first thing in your template.• More {% block %}s are better.• If you’re duplicating content, you’re missing a block.• {{ block.super }} 41
  97. 97. Documentationhttp://djangobook.com/en/2.0/chapter04/ http://django.me/templates 42
  98. 98. Exercise: /authors/ /authors/{id}/ /entries/ /entries/{slug}/ 43
  99. 99. Django trainingBONUS: Models and queries
  100. 100. Terminology 2
  101. 101. Modelsa.k.a. “DDL” 3
  102. 102. Managers a.k.a. “table” 4
  103. 103. QuerySets a.k.a. “selection” 5
  104. 104. Model instances a.k.a. “row” 6
  105. 105. !!!"!"#$#%&()*+,-./"*012.(31"456,21"7.8$9(6.:!!!"!"#$%&()*"+,&"-./0"123!4"$%&()*"523"-./0"6,&!7!!!".#$#!";<=!!!".$%&()*"+,&"-./0"123! Model Manager QuerySet Instance 7
  106. 106. Models 8
  107. 107. Instance methodsclass  Entry(models.Model):        …        def  is_by_jacob(self):                return  "jacob"  in  self.author.name.lower()…[1]  >>>  e  =  Entry.objects.get(pk=1)[2]  >>>  e.is_by_jacob()[2]      :  False 9
  108. 108. “Special” instance methods 10
  109. 109. __unicode__class  Entry(models.Model):        …        def  __unicode__(self):                return  self.headline…[1]  >>>  Entry.objects.all()[1]      :  [<Entry:  Man  bites  dog>,  <Entry:  Dog  bites  man>] 11
  110. 110. saveclass  Entry(models.Model):        …        def  save(self,  **kwargs):                self.word_count  =  count_words(self.body)                super(Entry,  self).save(**kwargs) 12
  111. 111. saveclass  Entry(models.Model):        …        def  save(self,  **kwargs):                self.word_count  =  count_words(self.body)                super(Entry,  self).save(**kwargs) Don’t forget this part! 13
  112. 112. deleteclass  Author(models.Model):        …        def  delete(self):                nobody  =  Author.objects.get(first_name=<NOBODY>)                self.entries.update(author=nobody)                super(Author,  self).delete() 14
  113. 113. Managers 15
  114. 114. Default managerclass  Entry(models.Model):        …        objects  =  models.Manager()…[1]  >>>  from  yabl.entries.models  import  Entry[2]  >>>  Entry.objects[2]      :  <django.db.models.manager.Manager  object  at  0x7eca70> 16
  115. 115. Custom managersclass  EntryManager(models.Manager):        def  future(self):                …        def  past(self):                …class  Entry(models.Model):        …        objects  =  EntryManager() 17
  116. 116. [1]  >>>  from  yabl.entries.models  import  Entry[2]  >>>  Entry.objects.future()[2]      :  [<Entry:  Hi>][3]  >>>  Entry.objects.past()[3]      :  [<Entry:  Man  bites  dog>,  <Entry:  Dog  bites  man>] 18
  117. 117. Documentation http://django.me/managers 19
  118. 118. QuerySets 20
  119. 119. Filters[1]  >>>  Author.objects.filter(first_name=Jacob)[1]      :  [<Author:  Jacob  Kaplan-­‐Moss>][2]  >>>  Author.objects.filter(last_name__contains=s)[2]      :  [<Author:  Miguel  de  Cervantes>,  <Author:  Jacob  Kaplan-­‐Moss>][3]  >>>  Author.objects.filter(last_name__contains=s,  first_name=Miguel)[3]      :  [<Author:  Miguel  de  Cervantes>][4]  >>>  Author.objects.filter(last_name__contains=s).filter(first_name=Miguel)[4]      :  [<Author:  Miguel  de  Cervantes>] 21
  120. 120. Field lookupsexact,  iexact name__exact=Joecontains,  icontains name__icontains=sstartswith,  endswith,   name__endswith=ndistartswith,  iendswith name__in=(Joe,  Jane)in author__in=Author.objects.filter(…)gt,  gte,  lt,  lte cost__gt=100 cost__range=(100,  500)range date__range=(now,  tomrrow) date__year=2009year,  month,  day,  week_day date__month=7isnull author__isnull=Trueregex,  iregex name__regex=^J.*b$ 22
  121. 121. Following relationships[1]  >>>  Entry.objects.filter(author__first_name__startswith=J)[1]      :  [<Entry:  Hi>][2]  >>>  Author.objects.filter(entries__headline=Hi)[2]      :  [<Author:  Jacob  Kaplan-­‐Moss>] Where’d that come from? 23
  122. 122. related_nameclass  Entry(models.Model):        author  =  models.ForeignKey(Author,  related_name=entries) 24
  123. 123. select_related()[1]  >>>  e  =  Entry.objects.get(pk=1)[2]  >>>  e.author[2]      :  <Author:  Jacob  Kaplan-­‐Moss>Oops,  that  did  a  second,  needless  query.[3]  >>>  e  =  Entry.objects.select_related().get(pk=1)[4]  >>>  e.author[5]      :  <Author:  Jacob  Kaplan-­‐Moss>No  second  query  needed  for  e.author 25
  124. 124. Limiting select_related()[1]  >>>  Entry.objects.select_related(author,  category)[2]  >>>  Entry.objects.select_related(depth=2) 26
  125. 125. QuerySet details 27
  126. 126. QuerySets are chainable[1]  >>>  Entry.objects.filter(    ....:          headline__contains=bites,    ....:  ).exclude(    ....:          pub_date__year=2008    ....:  ).filter(    ....:          pub_date__month=9    ....:  ) 28
  127. 127. QuerySets are unique[1]  >>>  qs1  =  Entry.objects.filter(headline__icontains=dog)[2]  >>>  qs2  =  qs1.exclude(pub_date__year=2008)[3]  >>>  qs3  =  qs1.filter(pub_date__year=2008) 29
  128. 128. QuerySets are lazy[1]  >>>  qs  =  Entry.objects.filter(headline__icontains=dog)[2]  >>>  qs  =  qs.exclude(pub_date__year=2008)[3]  >>>  qs  =  qs.filter(author__first_name=Jacob)[4]  >>>  qs[4]      :  [<Entry:  Man  bites  dog>,  <Entry:  Dog  bites  man>] 30
  129. 129. When QuerySets are evaluated• Iteration for  i  in  qs• Slicing qs[0:5]• Printing print  qs,  str(qs)• len() len(qs)• list() list(qs) 31
  130. 130. Chainable methodsfilter(),  exclude() qs.filter(name=Joe)order_by() qs.order_by(-­‐first_name)reverse() qs.reverse()distinct() qs.distinct()values(),  values_list() qs.values(first_name,  last_name) qs.dates(pub_date,  year)dates() qs.dates(pub_date,  month)select_related() qs.select_related() qs.defer(body)defer(),  only() qs.only(body,  headline) qs.all()none(),  all() qs.none() 32
  131. 131. Other QuerySet methodsget() e  =  Entry.objects.get(…)create() e  =  Entry.objects.create(…)get_or_create() e,  created  =  Entry.objects.get_or_create(…)count() Entry.objects.count()in_bulk() Entry.objects.in_bulk([1,  2,  3])latest() Entry.objects.latest(pub_date) 33
  132. 132. Raw SQL[1]  >>>  query  =  "SELECT  *  FROM  authors_author  WHERE  first_name  =  %s"[2]  >>>  params  =  ["Jacob"][3]  >>>  Entry.objects.raw(query,  params)[3]          [<Person:  Jacob  Kaplan-­‐Moss>] 34
  133. 133. Entry.objects.raw(query  %  params) No! 35
  134. 134. Other topics 36
  135. 135. Aggregationhttp://jacobian.org/r/django-aggregation 37
  136. 136. Transaction control http://jacobian.org/r/django-transactions 38
  137. 137. Exercise: /entries/future/ /entries/past/ 39
  138. 138. What else?• Forms, model forms, form sets, ...• File storage - local and remote.• Cookies, sessions, authn/authz.• GeoDjango• Built-in SQLi, XSS and CSRF protection.• i18n and l10n support.• Generic views,• &c! 1
  139. 139. Thank you! jacob@jacobian.orghttp://lanyrd.com/sfypm 2
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×