SlideShare a Scribd company logo
Django
Quickstart
Works for
    That’s me




https://www.facebook.com/groups/
What is Django?
Django quickstart
Demo: http://
Setting-up development
      environment

 ‣ virtualenv + virtualenvwrapper
Installing virtualenv and
      virtualenvwrapper
   $ pip install virtualenv

        then edit your .profile on osx or .bashrc
         on linux and add the following lines:


export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh

          reload your .profile or .bashrc files:


                $ . ~/.profile
Creating your virtual
            environment
             $ mkvirtualenv pyconph


              activating a virtual environment:

                  $ workon pyconph


                 for windows users:
‣ https://github.com/davidmarble/virtualenvwrapper-win
‣ https://bitbucket.org/guillermooo/virtualenvwrapper-
Installing Django

  $ pip install Django


 testing your Django installation:


$ python
>>> import django
>>> django.VERSION
(1, 4, 0, 'final', 0)
Creating a Django project
$ django-admin.py startproject quickstart


       Starting Django’s development server:



$ cd quickstart
$ python manage.py runserver
...
Development server is running at http://
127.0.0.1:8000/
Quit the server with CONTROL-C.
http://localhost:8000
Configuring your
 Django project
Django project directory structure:


 quickstart
 ├── manage.py
 └── quickstart
     ├── __init__.py
     ├── settings.py
     ├── urls.py
     └── wsgi.py
Setting-up database


quickstart/settings.py

 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': 'quickstart.sqlite',
         'USER': '',
         'PASSWORD': '',
         'HOST': '',
         'PORT': '',
     }
 }
Setting-up directories

quickstart/settings.py
 import os

 PROJECT_ROOT = os.path.split(os.path.abspath(
     os.path.dirname(__file__)))[0]

 STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
 STATIC_URL = '/static/'

 STATICFILES_DIRS = (
     os.path.join(PROJECT_ROOT, 'assets'),
 )
 ...
 TEMPLATE_DIRS = (
     os.path.join(PROJECT_ROOT, 'templates'),
 )
Creating directories

$ mkdir assets static templates



    quickstart
    ├── assets
    ├── manage.py
    ├── quickstart
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   ├── wsgi.py
    ├── static
    └── templates
Creating local settings

$ vim quickstart/localsettings.py

 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': 'quickstart.sqlite',
         'USER': '',
         'PASSWORD': '',
         'HOST': '',
         'PORT': '',
     }
 }
Creating local settings

quickstart/settings.py
 DATABASES = {
      'default': {
           'ENGINE': 'django.db.backends.',
           'NAME': '',
           'USER': '',
           'PASSWORD': '',
           'HOST': '',
           'PORT': '',
      }
 }
 ...
 try:
      from localsettings import *
 except ImportError:
      pass
Syncing the database

$ python manage.py syncdb
Creating tables ...
...
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'marconi'):
E-mail address: wombat@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Enabling the Django Admin

quickstart/settings.py

 INSTALLED_APPS = (
     ...
     'django.contrib.admin',
 )
Enabling the Django Admin

quickstart/urls.py
 from django.conf.urls import patterns, include, url

 from django.contrib import admin
 admin.autodiscover()

 urlpatterns = patterns('',
     url(r'^admin/', include(admin.site.urls)),
 )
Enabling the Django Admin
    $ python manage.py syncdb


    visit http://127.0.0.1/
Creating a Django App
$ django-admin.py startapp todo


     default app structure:

      todo
      ├── __init__.py
      ├── models.py
      ├── tests.py
      └── views.py
Installing your app



quickstart/settings.py
 INSTALLED_APPS = (
     ...
     'todo',
 )
Creating models


todo/models.py
 1 from django.db import models
 2
 3 class Todo(models.Model):
 4 name = models.CharField(max_length=100)
 5 is_done = models.BooleanField(default=False)
 6 created =
 models.DateTimeField(auto_now_add=True)
 8




                     Syncing
      $ python manage.py syncdb
Exposing models to Django



$ vim todo/admin.py

 from django.contrib import admin
 from todo.models import Todo

 class TodoAdmin(admin.ModelAdmin):
     pass

 admin.site.register(Todo, TodoAdmin)
Exposing models to Django
Creating forms
$ vim todo/forms.py

 1    from django import forms
 2    from todo.models import Todo
 3
 4    class TodoForm(forms.ModelForm):
 5        class Meta:
 6            model = Todo
 7            fields = ('name',)
 8
 9    class TodoListForm(forms.Form):
 10       def __init__(self, *args, **kwargs):
 11           todos = kwargs.pop('todos', [])
 12           super(TodoListForm, self).__init__(*args, **kwargs)
 13           for todo in todos:
 14               field = str(todo.id)
 15               self.fields[field] = forms.BooleanField(
 16                   required=False, label=todo.name)
 17               self.fields[field].is_done = todo.is_done
 18
 19       def clean(self):
 20           selected = [tid for tid, val in self.cleaned_data.items() if val]
 21           if not selected:
 22               raise forms.ValidationError("You need to select one or more items.")
 23           return selected
Creating views

todo/views.py

 1   from django.shortcuts import render_to_response, redirect
 2   from django.template import RequestContext
 3   from django.contrib import messages
 4
 5   from todo.forms import TodoListForm, TodoForm
 6   from todo.models import Todo

 ...
todo/views.py
 9 def home(request):
 10    todos = Todo.objects.order_by('-created')
 11    if request.method == 'POST':
 12        action = request.POST['action'].lower()
 13        todo_list_form = TodoListForm(data=request.POST, todos=todos)
 14        if todo_list_form.is_valid():
 15            selected = Todo.objects.filter(
 16                id__in=todo_list_form.cleaned_data)
 17            actions = {'done': lambda items: items.update(is_done=True),
 18                       'delete': lambda items: items.delete()}
 19            actions.get(action)(selected)
 20            messages.add_message(request, messages.SUCCESS,
 21                                  'Items has been updated.')
 22        else:
 23            messages.add_message(request, messages.ERROR,
 24                                  ''.join(todo_list_form.non_field_errors()))
 25        return redirect('home')
 26    else:
 27        todo_form = TodoForm()
 28        todo_list_form = TodoListForm(todos=todos)
 29    context = {'todo_list_form': todo_list_form, 'todo_form': todo_form}
 30    return render_to_response('todo/home.html', context,
 31                               RequestContext(request))
Creating views

todo/views.py
 34 def new_todo(request):
 35     if not request.method == 'POST':
 36         return redirect('home')
 37     todo_form = TodoForm(request.POST)
 38     if todo_form.is_valid():
 39         todo_form.save()
 40         messages.add_message(request, messages.SUCCESS,
 41                              'Item has been added.')
 42     else:
 43         messages.add_message(request, messages.ERROR,
 44                              'You need to enter a name.')
 45     return redirect('home')
Creating templates



$ mkdir templates/todo
$ touch templates/base.html
$ touch templates/todo/home.html
templates/base.html
 1    <html>
 2    <head>
 3       <title>TODO</title>
 4       <style type="text/css">
 5            fieldset {
 6                  width: 300px;
 7            }
 8       </style>
 9    </head>
 10   <body>
 11   {% if messages %}
 12   <section id="messages">
 13       <ul>
 14             {% for message in messages %}
 15                 <li>
 16                      {{ message }}
 17                 </li>
 18             {% endfor %}
 19       </ul>
 20   </section>
 21   {% endif %}
 22   {% block content %}
 23   {% endblock content %}
 24   </body>
 25   </html>
templates/todo/
1     {% extends "base.html" %}
2
3     {% block content %}
4     <form method="POST" action="{% url new_todo %}">
5        {% csrf_token %}
6        <fieldset>
7             <legend>Add new todo</legend>
8             <div class="field">
9                 {{ todo_form.name.label_tag }}
10                {{ todo_form.name }}
11                {% if todo_form.name.errors %}
12                    {{ todo_form.name.errors }}
13                {% endif %}
14            </div>
15            <input type="submit" name="action" value="Add">
16       </fieldset>
17    </form>

...
templates/todo/
...

19 <form method="POST">
20     {% csrf_token %}
21     <fieldset>
22         <legend>Items todo</legend>
23         {% for field in todo_list_form %}
24             <div class="field">
25                 {{ field }}
26                 <label for="{{ field.auto_id }}"
27                      {% if field.field.is_done %}
28                          style="text-decoration:line-through;"
29                      {% endif %}>
30                      {{ field.label }}
31                 </label>
32             </div>
33         {% empty %}
34             <p>You don't have anymore items todo.</p>
35         {% endfor %}
36     </fieldset>
37     <br />
38     <input type="submit" name="action" value="Done">
39     <input type="submit" name="action" value="Delete">
40 </form>
41 {% endblock content %}
Adding urls:
quickstart/urls.py

 urlpatterns = patterns('',
     ...
     url(r'^$', 'todo.views.home', name='home'),
     url(r'^todo/', include('todo.urls')),
 )



$ vim todo/urls.py

 from django.conf.urls import patterns, url

 urlpatterns = patterns('todo.views',
     url(r'^new/$', 'new_todo', name='new_todo'),
 )
Our TODO site:
Thank you :)

More Related Content

PDF
Backbone - TDC 2011 Floripa
PDF
Advanced Django
KEY
Symfony2 Building on Alpha / Beta technology
TXT
Data20161007
PDF
Django (Web Konferencia 2009)
KEY
Jython: Python para la plataforma Java (JRSL 09)
PDF
Ruby - Design patterns tdc2011
PDF
Aplicacoes dinamicas Rails com Backbone
Backbone - TDC 2011 Floripa
Advanced Django
Symfony2 Building on Alpha / Beta technology
Data20161007
Django (Web Konferencia 2009)
Jython: Python para la plataforma Java (JRSL 09)
Ruby - Design patterns tdc2011
Aplicacoes dinamicas Rails com Backbone

What's hot (20)

PPTX
How to Bring Common UI Patterns to ADF
ODP
PHPUnit elevato alla Symfony2
KEY
Jython: Python para la plataforma Java (EL2009)
PDF
Silex meets SOAP & REST
PDF
How te bring common UI patterns to ADF
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
PDF
Decoupling the Ulabox.com monolith. From CRUD to DDD
PDF
Intro programacion funcional
KEY
JQuery In Rails
KEY
Why ruby
PPTX
Component lifecycle hooks in Angular 2.0
KEY
Backbone js
KEY
Ruby/Rails
PDF
R57shell
PDF
Practical JavaScript Programming - Session 4/8
DOCX
VISUALIZAR REGISTROS EN UN JTABLE
KEY
Jquery Fundamentals
PDF
Symfony CoP: Form component
PDF
The Ring programming language version 1.6 book - Part 46 of 189
PDF
How I started to love design patterns
How to Bring Common UI Patterns to ADF
PHPUnit elevato alla Symfony2
Jython: Python para la plataforma Java (EL2009)
Silex meets SOAP & REST
How te bring common UI patterns to ADF
Design Patterns avec PHP 5.3, Symfony et Pimple
Decoupling the Ulabox.com monolith. From CRUD to DDD
Intro programacion funcional
JQuery In Rails
Why ruby
Component lifecycle hooks in Angular 2.0
Backbone js
Ruby/Rails
R57shell
Practical JavaScript Programming - Session 4/8
VISUALIZAR REGISTROS EN UN JTABLE
Jquery Fundamentals
Symfony CoP: Form component
The Ring programming language version 1.6 book - Part 46 of 189
How I started to love design patterns
Ad

Viewers also liked (20)

PDF
We Buy Cheese in a Cheese Shop
PPTX
Python, Development Environment for Windows
PDF
Python Recipes for django girls seoul
PDF
Django e il Rap Elia Contini
PDF
2 × 3 = 6
PDF
The Django Book, Chapter 16: django.contrib
PDF
2007 - 应用系统脆弱性概论
PDF
PyClab.__init__(self)
PDF
NoSql Day - Chiusura
PDF
The Django Book Chapter 9 - Django Workshop - Taipei.py
PDF
Vim for Mere Mortals
PDF
Website optimization
KEY
Overview of Testing Talks at Pycon
PPTX
2016 py con2016_lightingtalk_php to python
PDF
User-centered open source
PDF
라이트닝 토크 2015 파이콘
PDF
Bottle - Python Web Microframework
PDF
Django mongodb -djangoday_
ODP
Authentication & Authorization in ASPdotNet MVC
PPT
Load testing
We Buy Cheese in a Cheese Shop
Python, Development Environment for Windows
Python Recipes for django girls seoul
Django e il Rap Elia Contini
2 × 3 = 6
The Django Book, Chapter 16: django.contrib
2007 - 应用系统脆弱性概论
PyClab.__init__(self)
NoSql Day - Chiusura
The Django Book Chapter 9 - Django Workshop - Taipei.py
Vim for Mere Mortals
Website optimization
Overview of Testing Talks at Pycon
2016 py con2016_lightingtalk_php to python
User-centered open source
라이트닝 토크 2015 파이콘
Bottle - Python Web Microframework
Django mongodb -djangoday_
Authentication & Authorization in ASPdotNet MVC
Load testing
Ad

Similar to Django quickstart (20)

PPTX
Flask – Python
PPTX
Django crush course
PDF
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
PDF
Google App Engine in 40 minutes (the absolute essentials)
KEY
Knockout.js presentation
PDF
Unittests für Dummies
PPTX
Debugging in drupal 8
PDF
Introduction to Django
PDF
Django
PPTX
Angular 2 Architecture (Bucharest 26/10/2016)
PDF
Тестирование и Django
PDF
Awesome State Management for React and Other Virtual-Dom Libraries
PDF
Django at the Disco
PDF
Zagreb workshop
PDF
Refresh Austin - Intro to Dexy
PDF
Step By Step Guide For Buidling Simple Struts App
PDF
Django Vs Rails
PDF
Gae Meets Django
PDF
Be RESTful (Symfony Camp 2008)
PDF
Backbone.js — Introduction to client-side JavaScript MVC
Flask – Python
Django crush course
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Google App Engine in 40 minutes (the absolute essentials)
Knockout.js presentation
Unittests für Dummies
Debugging in drupal 8
Introduction to Django
Django
Angular 2 Architecture (Bucharest 26/10/2016)
Тестирование и Django
Awesome State Management for React and Other Virtual-Dom Libraries
Django at the Disco
Zagreb workshop
Refresh Austin - Intro to Dexy
Step By Step Guide For Buidling Simple Struts App
Django Vs Rails
Gae Meets Django
Be RESTful (Symfony Camp 2008)
Backbone.js — Introduction to client-side JavaScript MVC

Recently uploaded (20)

PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPT
Teaching material agriculture food technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Approach and Philosophy of On baking technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Cloud computing and distributed systems.
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
The AUB Centre for AI in Media Proposal.docx
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Digital-Transformation-Roadmap-for-Companies.pptx
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Teaching material agriculture food technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Approach and Philosophy of On baking technology
MYSQL Presentation for SQL database connectivity
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Cloud computing and distributed systems.
Spectral efficient network and resource selection model in 5G networks
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy

Django quickstart

  • 2. Works for That’s me https://www.facebook.com/groups/
  • 6. Setting-up development environment ‣ virtualenv + virtualenvwrapper
  • 7. Installing virtualenv and virtualenvwrapper $ pip install virtualenv then edit your .profile on osx or .bashrc on linux and add the following lines: export WORKON_HOME=~/Envs source /usr/local/bin/virtualenvwrapper.sh reload your .profile or .bashrc files: $ . ~/.profile
  • 8. Creating your virtual environment $ mkvirtualenv pyconph activating a virtual environment: $ workon pyconph for windows users: ‣ https://github.com/davidmarble/virtualenvwrapper-win ‣ https://bitbucket.org/guillermooo/virtualenvwrapper-
  • 9. Installing Django $ pip install Django testing your Django installation: $ python >>> import django >>> django.VERSION (1, 4, 0, 'final', 0)
  • 10. Creating a Django project $ django-admin.py startproject quickstart Starting Django’s development server: $ cd quickstart $ python manage.py runserver ... Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C.
  • 12. Configuring your Django project Django project directory structure: quickstart ├── manage.py └── quickstart ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
  • 13. Setting-up database quickstart/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'quickstart.sqlite', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } }
  • 14. Setting-up directories quickstart/settings.py import os PROJECT_ROOT = os.path.split(os.path.abspath( os.path.dirname(__file__)))[0] STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(PROJECT_ROOT, 'assets'), ) ... TEMPLATE_DIRS = ( os.path.join(PROJECT_ROOT, 'templates'), )
  • 15. Creating directories $ mkdir assets static templates quickstart ├── assets ├── manage.py ├── quickstart │   ├── __init__.py │   ├── settings.py │   ├── urls.py │   ├── wsgi.py ├── static └── templates
  • 16. Creating local settings $ vim quickstart/localsettings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'quickstart.sqlite', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } }
  • 17. Creating local settings quickstart/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', 'NAME': '', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } ... try: from localsettings import * except ImportError: pass
  • 18. Syncing the database $ python manage.py syncdb Creating tables ... ... Would you like to create one now? (yes/no): yes Username (leave blank to use 'marconi'): E-mail address: wombat@gmail.com Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)
  • 19. Enabling the Django Admin quickstart/settings.py INSTALLED_APPS = ( ... 'django.contrib.admin', )
  • 20. Enabling the Django Admin quickstart/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), )
  • 21. Enabling the Django Admin $ python manage.py syncdb visit http://127.0.0.1/
  • 22. Creating a Django App $ django-admin.py startapp todo default app structure: todo ├── __init__.py ├── models.py ├── tests.py └── views.py
  • 23. Installing your app quickstart/settings.py INSTALLED_APPS = ( ... 'todo', )
  • 24. Creating models todo/models.py 1 from django.db import models 2 3 class Todo(models.Model): 4 name = models.CharField(max_length=100) 5 is_done = models.BooleanField(default=False) 6 created = models.DateTimeField(auto_now_add=True) 8 Syncing $ python manage.py syncdb
  • 25. Exposing models to Django $ vim todo/admin.py from django.contrib import admin from todo.models import Todo class TodoAdmin(admin.ModelAdmin): pass admin.site.register(Todo, TodoAdmin)
  • 27. Creating forms $ vim todo/forms.py 1 from django import forms 2 from todo.models import Todo 3 4 class TodoForm(forms.ModelForm): 5 class Meta: 6 model = Todo 7 fields = ('name',) 8 9 class TodoListForm(forms.Form): 10 def __init__(self, *args, **kwargs): 11 todos = kwargs.pop('todos', []) 12 super(TodoListForm, self).__init__(*args, **kwargs) 13 for todo in todos: 14 field = str(todo.id) 15 self.fields[field] = forms.BooleanField( 16 required=False, label=todo.name) 17 self.fields[field].is_done = todo.is_done 18 19 def clean(self): 20 selected = [tid for tid, val in self.cleaned_data.items() if val] 21 if not selected: 22 raise forms.ValidationError("You need to select one or more items.") 23 return selected
  • 28. Creating views todo/views.py 1 from django.shortcuts import render_to_response, redirect 2 from django.template import RequestContext 3 from django.contrib import messages 4 5 from todo.forms import TodoListForm, TodoForm 6 from todo.models import Todo ...
  • 29. todo/views.py 9 def home(request): 10 todos = Todo.objects.order_by('-created') 11 if request.method == 'POST': 12 action = request.POST['action'].lower() 13 todo_list_form = TodoListForm(data=request.POST, todos=todos) 14 if todo_list_form.is_valid(): 15 selected = Todo.objects.filter( 16 id__in=todo_list_form.cleaned_data) 17 actions = {'done': lambda items: items.update(is_done=True), 18 'delete': lambda items: items.delete()} 19 actions.get(action)(selected) 20 messages.add_message(request, messages.SUCCESS, 21 'Items has been updated.') 22 else: 23 messages.add_message(request, messages.ERROR, 24 ''.join(todo_list_form.non_field_errors())) 25 return redirect('home') 26 else: 27 todo_form = TodoForm() 28 todo_list_form = TodoListForm(todos=todos) 29 context = {'todo_list_form': todo_list_form, 'todo_form': todo_form} 30 return render_to_response('todo/home.html', context, 31 RequestContext(request))
  • 30. Creating views todo/views.py 34 def new_todo(request): 35 if not request.method == 'POST': 36 return redirect('home') 37 todo_form = TodoForm(request.POST) 38 if todo_form.is_valid(): 39 todo_form.save() 40 messages.add_message(request, messages.SUCCESS, 41 'Item has been added.') 42 else: 43 messages.add_message(request, messages.ERROR, 44 'You need to enter a name.') 45 return redirect('home')
  • 31. Creating templates $ mkdir templates/todo $ touch templates/base.html $ touch templates/todo/home.html
  • 32. templates/base.html 1 <html> 2 <head> 3 <title>TODO</title> 4 <style type="text/css"> 5 fieldset { 6 width: 300px; 7 } 8 </style> 9 </head> 10 <body> 11 {% if messages %} 12 <section id="messages"> 13 <ul> 14 {% for message in messages %} 15 <li> 16 {{ message }} 17 </li> 18 {% endfor %} 19 </ul> 20 </section> 21 {% endif %} 22 {% block content %} 23 {% endblock content %} 24 </body> 25 </html>
  • 33. templates/todo/ 1 {% extends "base.html" %} 2 3 {% block content %} 4 <form method="POST" action="{% url new_todo %}"> 5 {% csrf_token %} 6 <fieldset> 7 <legend>Add new todo</legend> 8 <div class="field"> 9 {{ todo_form.name.label_tag }} 10 {{ todo_form.name }} 11 {% if todo_form.name.errors %} 12 {{ todo_form.name.errors }} 13 {% endif %} 14 </div> 15 <input type="submit" name="action" value="Add"> 16 </fieldset> 17 </form> ...
  • 34. templates/todo/ ... 19 <form method="POST"> 20 {% csrf_token %} 21 <fieldset> 22 <legend>Items todo</legend> 23 {% for field in todo_list_form %} 24 <div class="field"> 25 {{ field }} 26 <label for="{{ field.auto_id }}" 27 {% if field.field.is_done %} 28 style="text-decoration:line-through;" 29 {% endif %}> 30 {{ field.label }} 31 </label> 32 </div> 33 {% empty %} 34 <p>You don't have anymore items todo.</p> 35 {% endfor %} 36 </fieldset> 37 <br /> 38 <input type="submit" name="action" value="Done"> 39 <input type="submit" name="action" value="Delete"> 40 </form> 41 {% endblock content %}
  • 35. Adding urls: quickstart/urls.py urlpatterns = patterns('', ... url(r'^$', 'todo.views.home', name='home'), url(r'^todo/', include('todo.urls')), ) $ vim todo/urls.py from django.conf.urls import patterns, url urlpatterns = patterns('todo.views', url(r'^new/$', 'new_todo', name='new_todo'), )

Editor's Notes