Introduction to Django



   Master in Free Software   2009/2010

  Joaquim Rocha <jrocha@igalia.com>




                                3, July 2010
What is it?


"Django is a high­level Python Web framework 
that encourages rapid development and 
clean, pragmatic design."

From Django official website




                               Master in Free Software | 2009­2010   2
What is it?

Internal project of Lawrence Journal­World in 
2003
Should help journalists meet fast deadlines
Should not stand in the journalists' way
Got its name after the famous guitarrist 
Django Reinhardt 



                        Master in Free Software | 2009­2010   3
The framework

Object­Relational Mapper
Automatic Admin Interface
Elegant URL Design
Powerful Template System
i18n


it's amazing...!

                         Master in Free Software | 2009­2010   4
Big community

Django has a big community and an extensive list of 
Django apps

Search for them in http://code.google.com

Other interesting websites:

* Django sites: http://www.djangosites.org

* Django people: http://www.djangopeople.com

                              Master in Free Software | 2009­2010   5
Deployment


FastCGI
mod_python
mod_wsgi
...




                  Master in Free Software | 2009­2010   6
DB Backend


Officially supported:

PostgreSQL
MySQL
SQLite
Oracle



                        Master in Free Software | 2009­2010   7
Using Django




      Master in Free Software | 2009­2010   8
Installation
Just get a tarball release or checkout the sources:
http://djangoproject.com/download


Then:
# python setup.py install


Or:
# easy_install django

                            Master in Free Software | 2009­2010   9
Development




     Master in Free Software | 2009­2010   10
Creating a project
$ django­admin.py startproject Project


Project
    __init__.py
    manage.py
    settings.py
    urls.py

                       Master in Free Software | 2009­2010   11
Running the project


        $ ./manage.py runserver


...and open your browse at localhost:8000




                    Master in Free Software | 2009­2010   12
Running the project




         Master in Free Software | 2009­2010   13
Development


   Django Projects have Apps


Apps are the projects' components




                Master in Free Software | 2009­2010   14
Creating an App
$ ./manage.py startapp my_app


my_app
    __init__.py
    models.py
    tests.py
    views.py

                      Master in Free Software | 2009­2010   15
Building the database


  $ ./manage.py syncdb




            Master in Free Software | 2009­2010   16
Project's configuration



Easy configuration in the settings.py file




                     Master in Free Software | 2009­2010   17
Building the database



  $ ./manage.py syncdb




            Master in Free Software | 2009­2010   18
Development
Django follows the MTV design pattern:

        Model­Template­View




                   Master in Free Software | 2009­2010   19
Models
Models are a series of classes describing 
objects


They represent the database objects


           Never touch SQL again!



                        Master in Free Software | 2009­2010   20
Models


class Post(models.Model):

  title = models.CharField(max_length = 500)
  content = models.TextField()
  date = models.DateTimeField(auto_now = True)
   ...




                            Master in Free Software | 2009­2010   21
Views
Views are a series of functions that normally 
process some models and render HTML


           It's where the magic happens!


How to get all blog posts from the latest 5 days and order them by 
                        descending date?




                                 Master in Free Software | 2009­2010   22
Views
import datetime


def view_latest_posts(request):
    # Last 5 days
    date = datetime.datetime.now() -
                       datetime.timedelta(5)
    posts = Post.objects.filter(date__gte =
                                date).order_by('-
date')

   return render_to_response('posts/show_posts.html',
                             {'posts': posts})



                           Master in Free Software | 2009­2010   23
Templates


 Will not let you repeat yourself!


Will save designers from the code.




                 Master in Free Software | 2009­2010   24
Templates

<html>
  <head>
    <title>{% block title %}{% endblock %}</title>
  </head>
  <body>
    {% block content %}{% endblock %}
  </body>
</html>




                           Master in Free Software | 2009­2010   25
Templates
{% extends "base.html" %}

{% block title %}Homepage{% endblock %}

{% block content %}
  <h3>This will be some main content</h3>

  {% for post in posts %}
    <h4>{{ post.title }} on {{ post.date|date:"B d, Y"|
upper }}<h4>

   <p>{{ post.content }}</p>
 {% endfor %}

 {% url project.some_app.views.some_view some arguments %}

{% endblock %}


                               Master in Free Software | 2009­2010   26
URLs


 In Django, the URLs are part of the design!


urls.py use regular expressions to match URLs 
                  with Views




                       Master in Free Software | 2009­2010   27
URLs

urlpatterns = patterns('Project.some_app.views',
    (r'^$', 'index'),
    (r'^posts/(?P<r_id>d+)/$', 'view_latest_posts'),
    (r'^create/$', 'create'),
    url(r'^view/post/(?P<p_id>d+)/$', 'view',
                                 name = 'view_post'),
)




                           Master in Free Software | 2009­2010   28
Forms

Series of classes that represent an HTML form


Will let you easily configure the expected 
type of the inputs, error messages, labels, 
etc...




                        Master in Free Software | 2009­2010   29
Forms

class CreatePost(forms.Form):
  title = forms.CharField(label = "Post Title",
                           max_length = 500,
              widget = forms.TextInput(attrs={
                             'class': 'big_entry'
                              }))
  content = forms.CharField()
  tags = forms.CharField(required = False)




                         Master in Free Software | 2009­2010   30
Forms
def create_post(request):
  if request.method == 'POST':
    form = CreatePost(request.POST)
    if form.is_valid():
        # Create a new post object with data
        # from form.cleaned_data
        return HttpResponseRedirect('/index/')
  else:
    form = CreatePost()

return render_to_response('create.html', {
                           'form': form,
                           })


                         Master in Free Software | 2009­2010   31
Forms
The quick way:


<form action="/create/"
method="POST">
   {{ form.as_p }}
   <input type="submit" value="Create"
/>
</form>


                   Master in Free Software | 2009­2010   32
Where to go from here?




           Master in Free Software | 2009­2010   33
Django hosts
An extensive list is can be found at:
http://code.djangoproject.com/wiki/DjangoFriendlyWe
bHosts
Popular ones:
http://www.statopia.com/corporate/blog/2007/aug/05/
PopularDjangoHostingService/
Google's AppEngine is also Django friendly:
http://appengine.google.com/



                              Master in Free Software | 2009­2010   34
Help
Django Docs

http://docs.djangoproject.com


Some books
●   Learning Website Development with Django, 
    Packt
●   Practical Django Projects, Apress
●   Pro Django, Apress
                            Master in Free Software | 2009­2010   35

Django introduction