Slide 1

Slide 1 text

Django Quickstart

Slide 2

Slide 2 text

What is Django?

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Demo: http://quickstart.marconijr.com/

Slide 5

Slide 5 text

‣ virtualenv + virtualenvwrapper ‣ Django 1.4 Setting-up development environment

Slide 6

Slide 6 text

$ pip install virtualenv virtualenvwrapper Installing virtualenv and virtualenvwrapper export WORKON_HOME=~/Envs source /usr/local/bin/virtualenvwrapper.sh then edit your .profile on osx or .bashrc on linux and add the following lines: reload your .profile or .bashrc files: $ . ~/.profile

Slide 7

Slide 7 text

for windows users: ‣ https://github.com/davidmarble/virtualenvwrapper-win ‣ https://bitbucket.org/guillermooo/virtualenvwrapper- powershell Creating your virtual environment $ mkvirtualenv pyconph activating a virtual environment: $ workon pyconph

Slide 8

Slide 8 text

$ pip install Django Installing Django testing your Django installation: $ python >>> import django >>> django.VERSION (1, 4, 0, 'final', 0)

Slide 9

Slide 9 text

$ django-admin.py startproject quickstart Creating a Django project 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.

Slide 10

Slide 10 text

http://localhost:8000

Slide 11

Slide 11 text

Django project directory structure: quickstart ├── manage.py └── quickstart ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py Configuring your Django project

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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'), )

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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: [email protected] Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)

Slide 18

Slide 18 text

Enabling the Django Admin quickstart/settings.py INSTALLED_APPS = ( ... 'django.contrib.admin', )

Slide 19

Slide 19 text

quickstart/urls.py Enabling the Django Admin from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), )

Slide 20

Slide 20 text

$ python manage.py syncdb Enabling the Django Admin visit http://127.0.0.1/admin/

Slide 21

Slide 21 text

Creating a Django App $ django-admin.py startapp todo default app structure: todo ├── __init__.py ├── models.py ├── tests.py └── views.py

Slide 22

Slide 22 text

Installing your app quickstart/settings.py INSTALLED_APPS = ( ... 'todo', )

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Exposing models to Django Admin $ vim todo/admin.py from django.contrib import admin from todo.models import Todo class TodoAdmin(admin.ModelAdmin): pass admin.site.register(Todo, TodoAdmin)

Slide 25

Slide 25 text

Exposing models to Django Admin

Slide 26

Slide 26 text

Creating forms 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 $ vim todo/forms.py

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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)) todo/views.py

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Creating templates $ mkdir templates/todo $ touch templates/base.html $ touch templates/todo/home.html

Slide 31

Slide 31 text

templates/base.html 1 2 3 TODO 4 5 fieldset { 6 width: 300px; 7 } 8 9 10 11 {% if messages %} 12 13
    14 {% for message in messages %} 15
  • 16 {{ message }} 17
  • 18 {% endfor %} 19
20 21 {% endif %} 22 {% block content %} 23 {% endblock content %} 24 25

Slide 32

Slide 32 text

templates/todo/home.html 1 {% extends "base.html" %} 2 3 {% block content %} 4 5 {% csrf_token %} 6 7 Add new todo 8
9 {{ todo_form.name.label_tag }} 10 {{ todo_form.name }} 11 {% if todo_form.name.errors %} 12 {{ todo_form.name.errors }} 13 {% endif %} 14
15 16 17 ...

Slide 33

Slide 33 text

templates/todo/home.html ... 19 20 {% csrf_token %} 21 22 Items todo 23 {% for field in todo_list_form %} 24
25 {{ field }} 26 30 {{ field.label }} 31 32
33 {% empty %} 34

You don't have anymore items todo.

35 {% endfor %} 36 37
38 39 40 41 {% endblock content %}

Slide 34

Slide 34 text

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'), )

Slide 35

Slide 35 text

Our TODO site:

Slide 36

Slide 36 text

Thank you :)