[center]




           Django Avancé
              Yohann Gabory
Présentation de l’auteur



   Yohann Gabory
                   Webdevelopper Outscale




                   Auteur chez Eyrolles




                   Djangonaute depuis la version 0.95
Présentation de l’auteur



   Collaboration


                   Préface de Nicolas Ferrari, co-fondateur d’alwaysdata
                   (https://www.alwaysdata.com/)
                   Relecture de Thomas Petillon, consultant senior IT et
                   expert python/django
                   Éditions Eyrolles
Pourquoi un livre en français ?



   Aider les nouveaux arrivants



                   Le premier contact est plus facile en français
                   Le succès d’un outil tient à sa documentation
                   La documentation française n’est plus à jour depuis
                   looooongtemps
Pourquoi un livre en français ?



   Proposer de nouvelles choses


                   Le framework a beaucoup évolué depuis les parutions
                   anglophones
                   C’est un framework de plus en plus largement utilisé
                   Il est temps d’aller plus loin
                           Les CBV
                           Les “Reusable Apps”
                           Les besoins ont changé API, Oauth etc. . .
Pourquoi un livre en français ?


   “Apprendre la programmation web
   avec Python et Django”


                   Un livre didactique pour les débutants
                   Les base de la programmation web
                   Les notions essentielles
                   Mise en application avec Django
Un avant-goût du contenu du livre



   Des tutoriels


                  Un Bug Tracker
                          Parce que les bonnes pratiques se prennent dès le départ
                  Un Agenda Partagé
                          Tremble Google Agenda, les poneys arrivent!
                  Des exemples de “la vraie vie”
                          Parce c’est au pied du mur. . .
                  Une volonté d’aller au fond des choses
Un avant-goût du contenu du livre



   Des bonnes pratiques

                  Comment structurer ses modèles
                          quels type d’héritage utiliser
                          où mettre la logique de votre application
                  Le principe du DRY : partout
                          Dans les urls, les modèles, les vues, les templates.
                          Un seul endroit oui mais clairement identifiable: surtout!
                  Découplez!
                          Identifiez les usages
                          Une application == une fonctionalité
                          Écrivez “plug’n play”
                  Les bonnes façons de résoudre les problèmes
Un avant-goût du contenu du livre



   Des exemples avancés

                  une API Oauth2 avec Tastypie et Slumber
                          un serveur d’API
                          un client.
                          une revue des verbes HTTP:
                  GET, POST, PUT, DELETE, HEAD, PATCH. . .
                  une application de prototypage sans modèle
                          un bon exemple d’application réutilisable (sans modèle)
                          utilisant les capacités d’héritage des modèles Django.
                  Des hacks!
Les bonnes pratiques dans un projet pro


   La documentation d’un projet
   python/django
                  reStructuredText par l’exemple
                          les bonnes pratiques de la documentation
                          documentation des modules, des classes, des méthodes et
                          fonctions
                          les principaux mots clés de reStructuredText
                  Sphinx
                          présentation de l’outil
                          comment ça marche
                          comment l’utiliser dans un projet django
                  Le module “admindoc”
                          Principe de fonctionnement
                          cas d’utilisation
Les bonnes pratiques dans un projet pro


   Comment hériter correctement les
   templates

                  Par application
                          un dossier template
                          un fichier base.html
                          un dossier template/includes
                  Par Projet
                          Un dossier template
                          des dossiers par application sur-classées
                          penser “réutilisable”
Les patterns utiles



   L’héritage dans les modèles

                      Abstract
                          Des applications facilement surclassables
                      Multi-table
                          Moins de code/Plus de clarté
                      Proxy
                          Le plus oublié des héritages. . . Et pourtant!
                      Profitez de la souplesse de Python
                          Héritage de classes
                          Création de classes ou d’objet à la volée
                          Monkey patching: quand le besoin est impérieux
Exemple: Un blog ultra rapide.



   Un blog très rapidement : L’idée


                  Revoir en quelques lignes les grands concepts
                  Profiter de ce qu’une installation de base peut offrir
                  Le concept “Livré avec des piles” par l’exemple
                  un tour rapide sur les “contrib” que l’on oublie bien souvent
Exemple: Un blog ultra rapide.



   Initialisation



          $ django−admin . py s t a r t p r o j e c t b l o g g i n g
          $ cd b l o g g i n g
          $ python manage . py s t a r t a p p b l o g
Exemple: Un blog ultra rapide.



   Configuration: base de données


          # b l o g g i n g / b l o g g i n g / s e t t i n g s . py ( django >= 1 . 4 )
          DATABASES = {
                  ’ default ’ : {
                           ’ENGINE ’ : ’ django . db . backends . s q l i t e 3 ’ ,
                           ’NAME ’ : ’ d e v e l . db ’ ,
                  }
          }
Exemple: Un blog ultra rapide.



   Configuration: applications
          #blogging / blogging /          s e t t i n g s . py ( django >= 1 . 4 )
          INSTALLED_APPS = (
               ’ django . c o n t r i b   . auth ’ ,
               ’ django . c o n t r i b   . contenttypes ’ ,
               ’ django . c o n t r i b   . sessions ’ ,
               ’ django . c o n t r i b   . sites ’ ,
               ’ django . c o n t r i b   . messages ’ ,
               ’ django . c o n t r i b   . staticfiles ’ ,
               ’ django . c o n t r i b   . admin ’ ,
               ’ django . c o n t r i b   . admindocs ’ ,
               ’ django . c o n t r i b   . comments ’ ,
               ’ django . c o n t r i b   . sitemaps ’ ,
               ’ django . c o n t r i b   . syndication ’ ,
               ’ blog ’
           )
Exemple: Un blog ultra rapide.



   Configuration: urls
                  pattern de base
                  from django . c o n f . u r l s i m p o r t p a t t e r n s , i n c l u d e , u r l
                  from django . c o n t r i b i m p o r t admin
                  admin . a u t o d i s c o v e r ( )
                  u r l p a t t e r n s = p a t t e r n s ( ’ ’ , < i c i , l e s u r l s >)

                  L’application principale
                           u r l ( r ’ ^ blog / ’ , include ( ’ blog . u r l s ’ ) ) ,

                  La documentation Django
                           u r l ( r ’ ^ admin / doc / ’ ,
                                   i n c l u d e ( ’ django . c o n t r i b . admindocs . u r l s ’ ) ) ,

                  L’admin
                           u r l ( r ’ ^ admin / ’ , i n c l u d e ( admin . s i t e . u r l s ) ) ,

                  Les commentaires
                   u r l ( r ’ ^comments / ’ ,
                           i n c l u d e ( ’ django . c o n t r i b . comments . u r l s ’ ) ) ,
Exemple: Un blog ultra rapide.



   Les modèles : Catégorie

          # b l o g g i n g / b l o g / models . py

          from django . db i m p o r t models
          from django . c o n t r i b . auth . models i m p o r t User


          c l a s s C a t e g o r i e ( models . Model ) :
                  name = models . C h a r F i e l d ( max_length =250)
                  s l u g = models . S l u g F i e l d ( max_length =250)

                  d e f __unicode__ ( s e l f ) :
                        r e t u r n s e l f . name
Exemple: Un blog ultra rapide.



   Les models : les articles
          # b l o g g i n g / b l o g / models . py

          c l a s s A r t i c l e ( models . Model ) :
                   t i t l e = models . C h a r F i e l d ( max_length =250)
                  s l u g = models . S l u g F i e l d ( max_length =500)
                  a u t h o r = models . ForeignKey ( User )
                  c a t e g o r i e = models . ForeignKey ( C a t e g o r i e )
                  p u b l i s h e d _ d a t e = models . D a t e F i e l d ( auto_now_add=True )
                  c o n t e n t = models . T e x t F i e l d ( )

                  d e f __unicode__ ( s e l f ) :
                        return self . t i t l e

                  def get_absolute_url ( s e l f ) :
                      r e t u r n " / b l o g / a r t i c l e /%s " % s e l f . s l u g
Exemple: Un blog ultra rapide.



   Les urls: liste des derniers articles

                  Répondre à un besoin courant: lister les derniers objets
                          un model
                          un champ date.
                  # b l o g g i n g / b l o g / u r l s . py
                  urlpatterns = patterns ( ’ ’ ,
                          u r l ( r ’ ^$ ’ , ArchiveIndexView . as_view (
                                                   model= A r t i c l e ,
                                                    d a t e _ f i e l d =" published_date " ) ,
                                  name= ’ home ’ ) ,
                  )

                          et comme toujours on nomme les urls pour les utiliser dans
                          les templates
Exemple: Un blog ultra rapide.



   Les urls: Vue en liste

                  Les Articles
                          un seul argument: le modèle. Dans la “vraie vie”, on pagine.
                           url ( r ’^ articles /$ ’ ,
                                      L i s t V i e w . as_view ( model= A r t i c l e ) ,
                                name= ’ a r t i c l e s ’ ) ,

                  Les Catégories
                           u r l ( r ’ ^ categories / $ ’ ,
                                         L i s t V i e w . as_view ( model= C a t e g o r i e ) ,
                                  name= ’ c a t e g o r i e s ’ ) ,
Exemple: Un blog ultra rapide.



   Les urls: détails des objets

                  Les Articles
                          on utilise le slug pour construire les urls parce que les “pk”
                          c’est pas beau.
                           u r l ( r ’ a r t i c l e / ( ? P< slug > [  w−]+) / $ ’ ,
                                       D e t a i l V i e w . as_view ( model= A r t i c l e ) ,
                                  name= ’ a r t i c l e ’ ) ,

                  Les Catégories
                           u r l ( r ’ c a t e g o r i e / ( ? P< slug > [  w−]+) / $ ’ ,
                                       D e t a i l V i e w . as_view ( model= C a t e g o r i e ) ,
                                  name= ’ c a t e g o r i e ’ ) ,
Exemple: Un blog ultra rapide.



   L’admin
                  Une configuration très simple.
                          prepopulated_fields permet d’autogénérer le “slug” à partir
                          du titre.
                   from django . c o n t r i b i m p o r t admin
                   from b l o g . models i m p o r t Categorie , A r t i c l e


                   c l a s s A r t i c l e A d m i n ( admin . ModelAdmin ) :
                           prepopulated_fields = { " slug " : ( " t i t l e " , ) }


                   c l a s s CategorieAdmin ( admin . ModelAdmin ) :
                           p r e p o p u l a t e d _ f i e l d s = { " s l u g " : ( " name " , ) }


                  admin . s i t e . r e g i s t e r ( Categorie , CategorieAdmin )
                  admin . s i t e . r e g i s t e r ( A r t i c l e , A r t i c l e A d m i n )
Exemple: Un blog ultra rapide.



   Les templates : un menu

                  En utilisant “include”, le menu sera sur toutes les pages
                  Le menu est à un seul endroit clairement identifiable : DRY
                  les urls nommées sont utiles.

          # b l o g / t e m p l a t e s / i n c l u d e s / menu . h t m l
          <ul>
             < l i ><a h r e f = " {% u r l home %} " > A c c u e i l < / a>< / l i >
             < l i ><a h r e f = " {% u r l c a t e g o r i e s %} " > C a t g o r i e s < / a>< / l i >
             < l i ><a h r e f = " {% u r l a r t i c l e s %} " >Tous l e s a r t i c l e s < / a><
                      / li>
          </ ul>
Exemple: Un blog ultra rapide.



   Les templates : un article


                  la présentation d’un article se fait à un seul endroit.
                  les urls nommées acceptent des arguments

          #blog / templates / includes / prototype . html
          par < i > { { elem . a u t h o r } } < / i > dans l a c a t g o r i e
          <a h r e f = " {% u r l c a t e g o r i e elem . c a t e g o r i e . s l u g %} " >
             { { elem . c a t e g o r i e } }
          </a>
          <p > { { elem . c o n t e n t } } < / p>
Exemple: Un blog ultra rapide.


   Les templates : un fichier “base.html”
   minimal

                  tout ce qui doit être présenté sur toute les pages

          # b l o g / t e m p l a t e s / base . h t m l
          {% i n c l u d e " i n c l u d e s / menu . h t m l " %}
          {% b l o c k c o n t e n t %}
          {% endblock c o n t e n t %}

                  on peut créer autant de “placeholder” que l’on veut pour
                  structurer la page.
                          headers custom
                          footer
                          etc. . .
Exemple: Un blog ultra rapide.



   Les templates: vue “archive”

             1. convention over configuration
             2. nom du template : <nom du modèle>_archive.html

          {% extends " base . h t m l " %}
          {% b l o c k c o n t e n t %}
            {% f o r elem i n l a t e s t %}
              <h2>
                   <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ >
                      { { elem . t i t l e } }
                   </a>
               </ h2>
              {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %}
            {% e n d f o r %}
          {% endblock c o n t e n t %}
Exemple: Un blog ultra rapide.



   Les templates: vue ArticleS

                  Une itération simple
                  {% extends " base . h t m l " %}
                  {% b l o c k c o n t e n t %}
                    {% f o r elem i n o b j e c t _ l i s t %}
                      <h2>
                           <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ >
                              { { elem . t i t l e } }
                           </a>
                       </ h2>
                      {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %}
                    {% e n d f o r %}
                  {% endblock c o n t e n t %}
Exemple: Un blog ultra rapide.



   Les templates: CatégorieS
                  Itérations imbriquées.

                  {% extends " base . h t m l " %}
                  {% b l o c k c o n t e n t %}

                  {% f o r elem i n o b j e c t _ l i s t %}
                    <h2 > { { elem . name } } ( { { elem . a r t i c l e _ s e t . count } } ) </ h2>
                    {% f o r a r t i c l e i n elem . a r t i c l e _ s e t . a l l %}
                       <h3>
                          <a h r e f = ’ {% u r l a r t i c l e a r t i c l e . s l u g %} ’ >
                               {{ article . t i t l e }}
                          </a>
                       </ h3>
                    {% e n d f o r %}
                  {% e n d f o r %}

                  {% endblock c o n t e n t %}
Exemple: Un blog ultra rapide.



   Les templates: Article
                  load_comment charge les templatetags des commentaires
                  render_comment_list = liste des commentaires.
                  render_comment_form = formulaire de commentaire
                          CSRF_TOKEN, honeypot etc. . .
                          {% extends " base . h t m l " %}
                          {% l o a d comments %}
                          {% b l o c k c o n t e n t %}
                          {% w i t h o b j e c t as elem %}
                          {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %}
                          {% endwith %}
                          <h3>Commentaires< / h3>
                          {% r e n d e r _ c o m m e n t _ l i s t f o r o b j e c t %}
                          <h3> L a i s s e r un commentaire< / h3>
                          {% render_comment_form f o r o b j e c t %}
                          <a h r e f = " {% u r l a r t i c l e s %} " >
                              Retour           l a l i s t e des a r t i c l e s
                          < / a>
                          {% endblock c o n t e n t %}
Exemple: Un blog ultra rapide.



   Les templates: Catégorie

          {% extends " base . h t m l " %}
          {% b l o c k c o n t e n t %}
          <h2> { { o b j e c t . name } } ( { { o b j e c t . a r t i c l e _ s e t . count } } ) < / h2>
              {% f o r a r t i c l e i n o b j e c t . a r t i c l e _ s e t . a l l %}
                 <h3>
                     <a h r e f = ’{% u r l a r t i c l e a r t i c l e . s l u g %} ’>
                         {{ article . t i t l e }}
                     < / a>
                 < / h3>
              {% e n d f o r %}
          <a h r e f = " {% u r l c a t e g o r i e s %} " >
              Retour           l a l i s t e des c a t g o r i e s
          < / a>
          {% endblock c o n t e n t %}
Exemple: Un blog ultra rapide.



   Le Sitemap

          from django . c o n t r i b . sitemaps i m p o r t GenericSitemap

           info_dict = {
               ’ queryset ’ : A r t i c l e . objects . a l l ( ) ,
               ’ d a t e _ f i e l d ’ : ’ published_date ’ ,
           }

          sitemaps = {
               ’ b l o g ’ : GenericSitemap ( i n f o _ d i c t , p r i o r i t y = 0 . 6 ) ,
          }


           u r l ( r ’ ^ sitemap  . xml$ ’ , ’ django . c o n t r i b . sitemaps . views .
                  sitemap ’ ,
                   { ’ sitemaps ’ : sitemaps } ) ,
Exemple: Un blog ultra rapide.



   Les flux rss

          from django . c o n t r i b . s y n d i c a t i o n . views i m p o r t Feed
          c l a s s L a t e s t B l o g A r t i c l e ( Feed ) :
                   t i t l e = "Un super Blog "
                  l i n k = " / blog / "

                  def items ( s e l f ) :
                      r e t u r n A r t i c l e . o b j e c t s . order_by (
                                                ’− p u b l i s h e d _ d a t e ’ ) [ : 5 ]

                  def i t e m _ t i t l e ( s e l f , item ) :
                      r e t u r n item . t i t l e

                  def i t e m _ d e s c r i p t i o n ( s e l f , item ) :
                      r e t u r n item . content
Conclusion



  Questions



         Des questions ?
Conclusion



  Contacts



         yohann@gabory.fr // http://www.gabory.fr // @boblefrag
Conclusion



  Licence


             Présentation réalisée sous org-mode
             Theme Beamer sous licence GPLV3
             Présentation disponible sous Creative Commons
             Attribution - Partage dans les Mêmes Conditions 3.0 non
             transposé
             https://bitbucket.org/boblefrag/django-avanc-pr-sentation-
             du-5-novembre/

Presentation du Livre Django Avancé

  • 1.
    [center] Django Avancé Yohann Gabory
  • 2.
    Présentation de l’auteur Yohann Gabory Webdevelopper Outscale Auteur chez Eyrolles Djangonaute depuis la version 0.95
  • 3.
    Présentation de l’auteur Collaboration Préface de Nicolas Ferrari, co-fondateur d’alwaysdata (https://www.alwaysdata.com/) Relecture de Thomas Petillon, consultant senior IT et expert python/django Éditions Eyrolles
  • 4.
    Pourquoi un livreen français ? Aider les nouveaux arrivants Le premier contact est plus facile en français Le succès d’un outil tient à sa documentation La documentation française n’est plus à jour depuis looooongtemps
  • 5.
    Pourquoi un livreen français ? Proposer de nouvelles choses Le framework a beaucoup évolué depuis les parutions anglophones C’est un framework de plus en plus largement utilisé Il est temps d’aller plus loin Les CBV Les “Reusable Apps” Les besoins ont changé API, Oauth etc. . .
  • 6.
    Pourquoi un livreen français ? “Apprendre la programmation web avec Python et Django” Un livre didactique pour les débutants Les base de la programmation web Les notions essentielles Mise en application avec Django
  • 7.
    Un avant-goût ducontenu du livre Des tutoriels Un Bug Tracker Parce que les bonnes pratiques se prennent dès le départ Un Agenda Partagé Tremble Google Agenda, les poneys arrivent! Des exemples de “la vraie vie” Parce c’est au pied du mur. . . Une volonté d’aller au fond des choses
  • 8.
    Un avant-goût ducontenu du livre Des bonnes pratiques Comment structurer ses modèles quels type d’héritage utiliser où mettre la logique de votre application Le principe du DRY : partout Dans les urls, les modèles, les vues, les templates. Un seul endroit oui mais clairement identifiable: surtout! Découplez! Identifiez les usages Une application == une fonctionalité Écrivez “plug’n play” Les bonnes façons de résoudre les problèmes
  • 9.
    Un avant-goût ducontenu du livre Des exemples avancés une API Oauth2 avec Tastypie et Slumber un serveur d’API un client. une revue des verbes HTTP: GET, POST, PUT, DELETE, HEAD, PATCH. . . une application de prototypage sans modèle un bon exemple d’application réutilisable (sans modèle) utilisant les capacités d’héritage des modèles Django. Des hacks!
  • 10.
    Les bonnes pratiquesdans un projet pro La documentation d’un projet python/django reStructuredText par l’exemple les bonnes pratiques de la documentation documentation des modules, des classes, des méthodes et fonctions les principaux mots clés de reStructuredText Sphinx présentation de l’outil comment ça marche comment l’utiliser dans un projet django Le module “admindoc” Principe de fonctionnement cas d’utilisation
  • 11.
    Les bonnes pratiquesdans un projet pro Comment hériter correctement les templates Par application un dossier template un fichier base.html un dossier template/includes Par Projet Un dossier template des dossiers par application sur-classées penser “réutilisable”
  • 12.
    Les patterns utiles L’héritage dans les modèles Abstract Des applications facilement surclassables Multi-table Moins de code/Plus de clarté Proxy Le plus oublié des héritages. . . Et pourtant! Profitez de la souplesse de Python Héritage de classes Création de classes ou d’objet à la volée Monkey patching: quand le besoin est impérieux
  • 13.
    Exemple: Un blogultra rapide. Un blog très rapidement : L’idée Revoir en quelques lignes les grands concepts Profiter de ce qu’une installation de base peut offrir Le concept “Livré avec des piles” par l’exemple un tour rapide sur les “contrib” que l’on oublie bien souvent
  • 14.
    Exemple: Un blogultra rapide. Initialisation $ django−admin . py s t a r t p r o j e c t b l o g g i n g $ cd b l o g g i n g $ python manage . py s t a r t a p p b l o g
  • 15.
    Exemple: Un blogultra rapide. Configuration: base de données # b l o g g i n g / b l o g g i n g / s e t t i n g s . py ( django >= 1 . 4 ) DATABASES = { ’ default ’ : { ’ENGINE ’ : ’ django . db . backends . s q l i t e 3 ’ , ’NAME ’ : ’ d e v e l . db ’ , } }
  • 16.
    Exemple: Un blogultra rapide. Configuration: applications #blogging / blogging / s e t t i n g s . py ( django >= 1 . 4 ) INSTALLED_APPS = ( ’ django . c o n t r i b . auth ’ , ’ django . c o n t r i b . contenttypes ’ , ’ django . c o n t r i b . sessions ’ , ’ django . c o n t r i b . sites ’ , ’ django . c o n t r i b . messages ’ , ’ django . c o n t r i b . staticfiles ’ , ’ django . c o n t r i b . admin ’ , ’ django . c o n t r i b . admindocs ’ , ’ django . c o n t r i b . comments ’ , ’ django . c o n t r i b . sitemaps ’ , ’ django . c o n t r i b . syndication ’ , ’ blog ’ )
  • 17.
    Exemple: Un blogultra rapide. Configuration: urls pattern de base from django . c o n f . u r l s i m p o r t p a t t e r n s , i n c l u d e , u r l from django . c o n t r i b i m p o r t admin admin . a u t o d i s c o v e r ( ) u r l p a t t e r n s = p a t t e r n s ( ’ ’ , < i c i , l e s u r l s >) L’application principale u r l ( r ’ ^ blog / ’ , include ( ’ blog . u r l s ’ ) ) , La documentation Django u r l ( r ’ ^ admin / doc / ’ , i n c l u d e ( ’ django . c o n t r i b . admindocs . u r l s ’ ) ) , L’admin u r l ( r ’ ^ admin / ’ , i n c l u d e ( admin . s i t e . u r l s ) ) , Les commentaires u r l ( r ’ ^comments / ’ , i n c l u d e ( ’ django . c o n t r i b . comments . u r l s ’ ) ) ,
  • 18.
    Exemple: Un blogultra rapide. Les modèles : Catégorie # b l o g g i n g / b l o g / models . py from django . db i m p o r t models from django . c o n t r i b . auth . models i m p o r t User c l a s s C a t e g o r i e ( models . Model ) : name = models . C h a r F i e l d ( max_length =250) s l u g = models . S l u g F i e l d ( max_length =250) d e f __unicode__ ( s e l f ) : r e t u r n s e l f . name
  • 19.
    Exemple: Un blogultra rapide. Les models : les articles # b l o g g i n g / b l o g / models . py c l a s s A r t i c l e ( models . Model ) : t i t l e = models . C h a r F i e l d ( max_length =250) s l u g = models . S l u g F i e l d ( max_length =500) a u t h o r = models . ForeignKey ( User ) c a t e g o r i e = models . ForeignKey ( C a t e g o r i e ) p u b l i s h e d _ d a t e = models . D a t e F i e l d ( auto_now_add=True ) c o n t e n t = models . T e x t F i e l d ( ) d e f __unicode__ ( s e l f ) : return self . t i t l e def get_absolute_url ( s e l f ) : r e t u r n " / b l o g / a r t i c l e /%s " % s e l f . s l u g
  • 20.
    Exemple: Un blogultra rapide. Les urls: liste des derniers articles Répondre à un besoin courant: lister les derniers objets un model un champ date. # b l o g g i n g / b l o g / u r l s . py urlpatterns = patterns ( ’ ’ , u r l ( r ’ ^$ ’ , ArchiveIndexView . as_view ( model= A r t i c l e , d a t e _ f i e l d =" published_date " ) , name= ’ home ’ ) , ) et comme toujours on nomme les urls pour les utiliser dans les templates
  • 21.
    Exemple: Un blogultra rapide. Les urls: Vue en liste Les Articles un seul argument: le modèle. Dans la “vraie vie”, on pagine. url ( r ’^ articles /$ ’ , L i s t V i e w . as_view ( model= A r t i c l e ) , name= ’ a r t i c l e s ’ ) , Les Catégories u r l ( r ’ ^ categories / $ ’ , L i s t V i e w . as_view ( model= C a t e g o r i e ) , name= ’ c a t e g o r i e s ’ ) ,
  • 22.
    Exemple: Un blogultra rapide. Les urls: détails des objets Les Articles on utilise le slug pour construire les urls parce que les “pk” c’est pas beau. u r l ( r ’ a r t i c l e / ( ? P< slug > [ w−]+) / $ ’ , D e t a i l V i e w . as_view ( model= A r t i c l e ) , name= ’ a r t i c l e ’ ) , Les Catégories u r l ( r ’ c a t e g o r i e / ( ? P< slug > [ w−]+) / $ ’ , D e t a i l V i e w . as_view ( model= C a t e g o r i e ) , name= ’ c a t e g o r i e ’ ) ,
  • 23.
    Exemple: Un blogultra rapide. L’admin Une configuration très simple. prepopulated_fields permet d’autogénérer le “slug” à partir du titre. from django . c o n t r i b i m p o r t admin from b l o g . models i m p o r t Categorie , A r t i c l e c l a s s A r t i c l e A d m i n ( admin . ModelAdmin ) : prepopulated_fields = { " slug " : ( " t i t l e " , ) } c l a s s CategorieAdmin ( admin . ModelAdmin ) : p r e p o p u l a t e d _ f i e l d s = { " s l u g " : ( " name " , ) } admin . s i t e . r e g i s t e r ( Categorie , CategorieAdmin ) admin . s i t e . r e g i s t e r ( A r t i c l e , A r t i c l e A d m i n )
  • 24.
    Exemple: Un blogultra rapide. Les templates : un menu En utilisant “include”, le menu sera sur toutes les pages Le menu est à un seul endroit clairement identifiable : DRY les urls nommées sont utiles. # b l o g / t e m p l a t e s / i n c l u d e s / menu . h t m l <ul> < l i ><a h r e f = " {% u r l home %} " > A c c u e i l < / a>< / l i > < l i ><a h r e f = " {% u r l c a t e g o r i e s %} " > C a t g o r i e s < / a>< / l i > < l i ><a h r e f = " {% u r l a r t i c l e s %} " >Tous l e s a r t i c l e s < / a>< / li> </ ul>
  • 25.
    Exemple: Un blogultra rapide. Les templates : un article la présentation d’un article se fait à un seul endroit. les urls nommées acceptent des arguments #blog / templates / includes / prototype . html par < i > { { elem . a u t h o r } } < / i > dans l a c a t g o r i e <a h r e f = " {% u r l c a t e g o r i e elem . c a t e g o r i e . s l u g %} " > { { elem . c a t e g o r i e } } </a> <p > { { elem . c o n t e n t } } < / p>
  • 26.
    Exemple: Un blogultra rapide. Les templates : un fichier “base.html” minimal tout ce qui doit être présenté sur toute les pages # b l o g / t e m p l a t e s / base . h t m l {% i n c l u d e " i n c l u d e s / menu . h t m l " %} {% b l o c k c o n t e n t %} {% endblock c o n t e n t %} on peut créer autant de “placeholder” que l’on veut pour structurer la page. headers custom footer etc. . .
  • 27.
    Exemple: Un blogultra rapide. Les templates: vue “archive” 1. convention over configuration 2. nom du template : <nom du modèle>_archive.html {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n l a t e s t %} <h2> <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ > { { elem . t i t l e } } </a> </ h2> {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 28.
    Exemple: Un blogultra rapide. Les templates: vue ArticleS Une itération simple {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n o b j e c t _ l i s t %} <h2> <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ > { { elem . t i t l e } } </a> </ h2> {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 29.
    Exemple: Un blogultra rapide. Les templates: CatégorieS Itérations imbriquées. {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n o b j e c t _ l i s t %} <h2 > { { elem . name } } ( { { elem . a r t i c l e _ s e t . count } } ) </ h2> {% f o r a r t i c l e i n elem . a r t i c l e _ s e t . a l l %} <h3> <a h r e f = ’ {% u r l a r t i c l e a r t i c l e . s l u g %} ’ > {{ article . t i t l e }} </a> </ h3> {% e n d f o r %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 30.
    Exemple: Un blogultra rapide. Les templates: Article load_comment charge les templatetags des commentaires render_comment_list = liste des commentaires. render_comment_form = formulaire de commentaire CSRF_TOKEN, honeypot etc. . . {% extends " base . h t m l " %} {% l o a d comments %} {% b l o c k c o n t e n t %} {% w i t h o b j e c t as elem %} {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% endwith %} <h3>Commentaires< / h3> {% r e n d e r _ c o m m e n t _ l i s t f o r o b j e c t %} <h3> L a i s s e r un commentaire< / h3> {% render_comment_form f o r o b j e c t %} <a h r e f = " {% u r l a r t i c l e s %} " > Retour l a l i s t e des a r t i c l e s < / a> {% endblock c o n t e n t %}
  • 31.
    Exemple: Un blogultra rapide. Les templates: Catégorie {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} <h2> { { o b j e c t . name } } ( { { o b j e c t . a r t i c l e _ s e t . count } } ) < / h2> {% f o r a r t i c l e i n o b j e c t . a r t i c l e _ s e t . a l l %} <h3> <a h r e f = ’{% u r l a r t i c l e a r t i c l e . s l u g %} ’> {{ article . t i t l e }} < / a> < / h3> {% e n d f o r %} <a h r e f = " {% u r l c a t e g o r i e s %} " > Retour l a l i s t e des c a t g o r i e s < / a> {% endblock c o n t e n t %}
  • 32.
    Exemple: Un blogultra rapide. Le Sitemap from django . c o n t r i b . sitemaps i m p o r t GenericSitemap info_dict = { ’ queryset ’ : A r t i c l e . objects . a l l ( ) , ’ d a t e _ f i e l d ’ : ’ published_date ’ , } sitemaps = { ’ b l o g ’ : GenericSitemap ( i n f o _ d i c t , p r i o r i t y = 0 . 6 ) , } u r l ( r ’ ^ sitemap . xml$ ’ , ’ django . c o n t r i b . sitemaps . views . sitemap ’ , { ’ sitemaps ’ : sitemaps } ) ,
  • 33.
    Exemple: Un blogultra rapide. Les flux rss from django . c o n t r i b . s y n d i c a t i o n . views i m p o r t Feed c l a s s L a t e s t B l o g A r t i c l e ( Feed ) : t i t l e = "Un super Blog " l i n k = " / blog / " def items ( s e l f ) : r e t u r n A r t i c l e . o b j e c t s . order_by ( ’− p u b l i s h e d _ d a t e ’ ) [ : 5 ] def i t e m _ t i t l e ( s e l f , item ) : r e t u r n item . t i t l e def i t e m _ d e s c r i p t i o n ( s e l f , item ) : r e t u r n item . content
  • 34.
    Conclusion Questions Des questions ?
  • 35.
    Conclusion Contacts yohann@gabory.fr // http://www.gabory.fr // @boblefrag
  • 36.
    Conclusion Licence Présentation réalisée sous org-mode Theme Beamer sous licence GPLV3 Présentation disponible sous Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non transposé https://bitbucket.org/boblefrag/django-avanc-pr-sentation- du-5-novembre/