TP : Gestion d’une liste de tâches - Models + Admin (1/3)

date:2012-04-30 12:51
tags:django, python
category:Django
author:Rémy Hubscher

Énoncé

Pour découvrir Django en douceur, je vous propose une première petite app.

Il s’agit de gérer une liste de tâche.

Dans un premier temps, nous avons une unique liste.

  1. Nous voulons ajouter des tâches dans la liste
  2. Nous voulons dire que la tâche est réalisée (la barrer)
  3. Nous voulons pouvoir vider la liste en fin de journée
  4. Nous voulons pouvoir marquer toutes les tâches comme terminée
  5. Nous voulons pouvoir supprimer une tâche

Créer une nouvelle app

Pour créer une app, vous devez entrer la commande suivante

$ python manage.py startapp todo

L’organisation des app se fait de la manière suivante :

  1. Si votre app est spécifique à votre projet, vous devez la mettre dans le répertoire du projet

    tuto_django/
    ├── manage.py
    └── tuto_django
        ├── __init__.py
        ├── settings.py
        ├── todo
        │   ├── __init__.py
        │   ├── models.py
        │   ├── tests.py
        │   └── views.py
        ├── urls.py
        └── wsgi.py
    
  2. Si votre app peut-être ensuite réutilisée, vous devez la mettre à côté du manage.py

    tuto_django/
    ├── manage.py
    ├── todo
    │   ├── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    └── tuto_django
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    

Il ne faut pas oublier d’ajouter l’app dans le fichier de settings.py du projet à la variable INSTALLED_APP.

Soit ‘tuto_django.todo’ pour 1. soit ‘todo’ pour 2.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'todo',
)

Ici on en profite aussi pour activer l’administration automatique de Django.

Models

Première chose à faire notre modèle de données pour stocker notre liste.

# -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _

class Task(models.Model):
    content = models.CharField(_(u'task'), max_length=255)
    is_resolved = models.BooleanField(_(u'Resolved?'))

    def __unicode__(self):
        return u'Task %d : %s' % (self.id, self.content)

Rien de bien compliquer pour commencer :

  1. On créé le modèle d’une tâche
  2. On définit qu’elle a un champ content qui va contenir l’énoncé de la tâche
  3. On code toujours tout en anglais et on verra comment traduire ensuite
  4. Dans les models on utilise ugettext_lazy pour ensuite pouvoir traduire notre app en français

Pour avoir la liste des fields disponibles c’est dans la documentation

Création de la BDD

On va maintenant créer la base de données avec notre projet

$ python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Creating table todo_task

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'natim'): admin
E-mail address: natim@siteduzero.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Pour finir on va créer un super-utilisateur qui nous permettra d’administrer notre liste de tâche.

Création des urls

On va activer l’URL pour l’admin dans le fichier urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'tuto_django.views.home', name='home'),
    # url(r'^tuto_django/', include('tuto_django.foo.urls')),

    url(r'^admin/', include(admin.site.urls)),
)

Je laisse les deux examples car ils seront intéressant pour la suite.

Activation de l’admin de Todo

On va créer le fichier admin.py dans l’app todo

# -*- coding: utf-8 -*-
from django.contrib import admin
from todo.models import Task

admin.site.register(Task)

Lancement du serveur

Comme précédement on va lancer notre serveur

$ python manage.py runserver

On se rends ensuite ici : http://localhost:8000/admin/

On se connecte avec l’utilisateur créé lors du syncdb et on peut maintenant créer ses tâches.

../_images/admin-login.png ../_images/admin.png ../_images/tasks.png ../_images/task.png