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

Django Quickstart

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Django Quickstart

Avatar for Marconi Moreto

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