SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Django
Quickstart
Works for
    That’s me




https://www.facebook.com/groups/
What is Django?
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 :)

Weitere ähnliche Inhalte

Was ist angesagt?

How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF Luc Bors
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2eugenio pombi
 
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Leonardo Soto
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Decoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDDecoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDAleix Vergés
 
Intro programacion funcional
Intro programacion funcionalIntro programacion funcional
Intro programacion funcionalNSCoder Mexico
 
JQuery In Rails
JQuery In RailsJQuery In Rails
JQuery In RailsLouie Zhao
 
Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0Eyal Vardi
 
Backbone js
Backbone jsBackbone js
Backbone jsrstankov
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Railsrstankov
 
R57shell
R57shellR57shell
R57shellady36
 
Practical JavaScript Programming - Session 4/8
Practical JavaScript Programming - Session 4/8Practical JavaScript Programming - Session 4/8
Practical JavaScript Programming - Session 4/8Wilson Su
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEDarwin Durand
 
Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form componentSamuel ROZE
 
The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189Mahmoud Samir Fayed
 
How I started to love design patterns
How I started to love design patternsHow I started to love design patterns
How I started to love design patternsSamuel ROZE
 

Was ist angesagt? (20)

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

Andere mochten auch

We Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese ShopWe Buy Cheese in a Cheese Shop
We Buy Cheese in a Cheese ShopTzu-ping Chung
 
Python, Development Environment for Windows
Python, Development Environment for WindowsPython, Development Environment for Windows
Python, Development Environment for WindowsKwangyoun Jung
 
Python Recipes for django girls seoul
Python Recipes for django girls seoulPython Recipes for django girls seoul
Python Recipes for django girls seoulJoeun Park
 
Django e il Rap Elia Contini
Django e il Rap Elia ContiniDjango e il Rap Elia Contini
Django e il Rap Elia ContiniWEBdeBS
 
The Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contribThe Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contribTzu-ping Chung
 
2007 - 应用系统脆弱性概论
2007 - 应用系统脆弱性概论 2007 - 应用系统脆弱性概论
2007 - 应用系统脆弱性概论 Na Lee
 
NoSql Day - Chiusura
NoSql Day - ChiusuraNoSql Day - Chiusura
NoSql Day - ChiusuraWEBdeBS
 
The Django Book Chapter 9 - Django Workshop - Taipei.py
The Django Book Chapter 9 - Django Workshop - Taipei.pyThe Django Book Chapter 9 - Django Workshop - Taipei.py
The Django Book Chapter 9 - Django Workshop - Taipei.pyTzu-ping Chung
 
Overview of Testing Talks at Pycon
Overview of Testing Talks at PyconOverview of Testing Talks at Pycon
Overview of Testing Talks at PyconJacqueline Kazil
 
2016 py con2016_lightingtalk_php to python
2016 py con2016_lightingtalk_php to python2016 py con2016_lightingtalk_php to python
2016 py con2016_lightingtalk_php to pythonJiho Lee
 
라이트닝 토크 2015 파이콘
라이트닝 토크 2015 파이콘라이트닝 토크 2015 파이콘
라이트닝 토크 2015 파이콘Jiho Lee
 
Django mongodb -djangoday_
Django mongodb -djangoday_Django mongodb -djangoday_
Django mongodb -djangoday_WEBdeBS
 
Authentication & Authorization in ASPdotNet MVC
Authentication & Authorization in ASPdotNet MVCAuthentication & Authorization in ASPdotNet MVC
Authentication & Authorization in ASPdotNet MVCMindfire Solutions
 

Andere mochten auch (20)

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

Ähnlich wie Django quickstart

Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Tsuyoshi Yamamoto
 
Google App Engine in 40 minutes (the absolute essentials)
Google App Engine in 40 minutes (the absolute essentials)Google App Engine in 40 minutes (the absolute essentials)
Google App Engine in 40 minutes (the absolute essentials)Python Ireland
 
Knockout.js presentation
Knockout.js presentationKnockout.js presentation
Knockout.js presentationScott Messinger
 
Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8Allie Jones
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to DjangoJoaquim Rocha
 
Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Eyal Vardi
 
Тестирование и Django
Тестирование и DjangoТестирование и Django
Тестирование и DjangoMoscowDjango
 
Awesome State Management for React and Other Virtual-Dom Libraries
Awesome State Management for React and Other Virtual-Dom LibrariesAwesome State Management for React and Other Virtual-Dom Libraries
Awesome State Management for React and Other Virtual-Dom LibrariesFITC
 
Zagreb workshop
Zagreb workshopZagreb workshop
Zagreb workshopLynn Root
 
Refresh Austin - Intro to Dexy
Refresh Austin - Intro to DexyRefresh Austin - Intro to Dexy
Refresh Austin - Intro to Dexyananelson
 
Step By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts AppStep By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts AppSyed Shahul
 
Gae Meets Django
Gae Meets DjangoGae Meets Django
Gae Meets Djangofool2nd
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Fabien Potencier
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCpootsbook
 

Ähnlich wie Django quickstart (20)

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

Kürzlich hochgeladen

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 

Kürzlich hochgeladen (20)

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 

Django quickstart

  • 2. Works for That’s me https://www.facebook.com/groups/
  • 4.
  • 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'), )

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n