Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Django Quickstart

Django Quickstart

Marconi Moreto

June 30, 2012
Tweet

More Decks by Marconi Moreto

Other Decks in Programming

Transcript

  1. Django
    Quickstart

    View Slide

  2. What is Django?

    View Slide

  3. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. http://localhost:8000

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 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)),
    )

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. Exposing models to Django Admin

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. templates/base.html
    1
    2
    3 TODO
    4 <br/>5 fieldset {<br/>6 width: 300px;<br/>7 }<br/>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

    View Slide

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

    View Slide

  33. templates/todo/home.html
    ...
    19
    20 {% csrf_token %}
    21
    22 Items todo
    23 {% for field in todo_list_form %}
    24
    25 {{ field }}
    26 27 {% if field.field.is_done %}
    28 style="text-decoration:line-through;"
    29 {% endif %}>
    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 %}

    View Slide

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

    View Slide

  35. Our TODO site:

    View Slide

  36. Thank you :)

    View Slide