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. $ 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
  2. $ pip install Django Installing Django testing your Django installation:

    $ python >>> import django >>> django.VERSION (1, 4, 0, 'final', 0)
  3. $ 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.
  4. Django project directory structure: quickstart ├── manage.py └── quickstart ├──

    __init__.py ├── settings.py ├── urls.py └── wsgi.py Configuring your Django project
  5. Setting-up database quickstart/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3',

    'NAME': 'quickstart.sqlite', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } }
  6. 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'), )
  7. Creating directories quickstart ├── assets ├── manage.py ├── quickstart │

    ├── __init__.py │ ├── settings.py │ ├── urls.py │ ├── wsgi.py ├── static └── templates $ mkdir assets static templates
  8. Creating local settings $ vim quickstart/localsettings.py DATABASES = { 'default':

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

    'django.db.backends.', 'NAME': '', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } ... try: from localsettings import * except ImportError: pass
  10. 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)
  11. 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)), )
  12. Creating a Django App $ django-admin.py startapp todo default app

    structure: todo ├── __init__.py ├── models.py ├── tests.py └── views.py
  13. 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
  14. 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)
  15. 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
  16. 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 ...
  17. 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
  18. 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')
  19. 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>
  20. templates/todo/home.html 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> ...
  21. templates/todo/home.html ... 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 %}
  22. 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'), )