Créez votre blog avec Django 1.0 !

Posté le 22 octobre 2008

Ne vous attendez pas à un méga super tuto de la mort qui vous détaille de A à Z la marche à suivre pour développer votre moteur de blog avec le framework Django . Non, je ne m'aventurerai pas sur ce terrain pour risquer de refaire en moins bien ce que d'autres ont déjà très bien fait: un petit tour du côté de mes liens sur le sujet vous aidera probablement...

Cependant voici enfin le code source de ce blog à télécharger, analyser, disséquer... tout ce que vous voudrez... en espérant qu'il vous sera utile en vous servant d'exemple pour vous initier aux joies du développement web avec Django. Attention, le code a été récemment remanié pour être compatible avec la version 1.0 finale du framework, donc les version 0.9x et antérieures ne pourront le faire tourner.

Si vous avez des questions ou suggestions au sujet de ce code, n'hésitez pas ! Je ne prétends pas qu'il soit parfait ni d'une beauté extrême mais il a le mérite d'être simple et fonctionnel.

Bonne lecture et amusez-vous bien !

 

Mise à jour: Je maintiens régulièrement la compatibilité du code avec les nouvelles versions de Django et j'ajoute également de temps en temps de nouvelles fonctionnalités pour mes propres besoins. Si vous souhaitez récupérer la dernière version du code source, suivez les mises à jour sur ce dépôt Mercurial.

 

 

2007 - Morgan LEFIEUX - Creative Commons License
Cette création est mise à disposition sous un contrat Creative Commons.

Commentaires

#1

JKS, le 24 octobre 2008 à 14:58 :

Juste un simple MERCI !

#2

yjx, le 28 octobre 2008 à 12:46 :

Bravo pour cette contribution !

#3

dj, le 11 décembre 2008 à 16:37 :

salut, merci pour ton code il me permet de bien debuter avec django, cependant en voulant utiliser le module d'authentification (j'utilise les décorateurs), j'ai l'erreur Site matching query does not exist il est du a quoi et comment le resoudre

#4

Comète, le 28 décembre 2008 à 17:23 :

Salut,

désolé de ne pas avoir pu répondre plus tôt mais je viens de déménager et j'étais donc en panne d'internet :)
Pour ton problème, as-tu vu ceci ?
http://www.mail-archive.com/django-users@googlegroups.com/msg12549.html

#5

cambuntu, le 5 janvier 2009 à 17:02 :

Salut, j'ai resolu mon probleme, cependant j'en ai encore svp les dates je voudrais qu'il soit ainsi jour/mois/annee dans tout mon application et meme dans mon formulaire jour/mois/annee qu'un seul format soit acceptés cependant je ne trouve pas de solution svp lorque on redefinie la methode save() comment tenir compte du moment d'ajout ou de modification et aussi comment renvoyer une erreur vers une page merci

#6

leau2001, le 27 janvier 2009 à 18:55 :

BOnjour,

j'ai installé votre module blog, dans mon projet et j'ai un petit soucis avec markdown

ImportError at /admin/blog/entry/add/

No module named markdown

je l'ai pourtant installé avec easy_install tout semble ok.... je signale ne passant que je suis sous virtualenv pour mon projet...

une idée ?

#7

leau2001, le 27 janvier 2009 à 19:56 :

Re moi,

j'ai aussi un soucis avec les catégories... elles sont liées aux Tags...

bizarre ça...

#8

Comète, le 27 janvier 2009 à 21:33 :

Bonsoir,

pour markdown il faut installer le module python-markdown (http://www.freewisdom.org/projects/python-markdown/) qui est l'implémentation de markdown pour Python.

Pour l'installer sous Ubuntu:
sudo apt-get install python-markdown

Pour les catégories, elles sont gérées par la classe "Tag". Oui je sais que les tags et les catégories sont normalement utilisés différemment mais ici j'assimile les tags à des catégories... Suis-je bien clair ? :p

#9

leau2001, le 28 janvier 2009 à 07:46 :

Oui c'est très clair,

j'ai fais un easy_install markdown, qui me semblait avoir bien installé tout ce qu'il faut... en fait il n'avait pas dézippé le egg dans mon sitepackages... je l'ai fais à la main et ça marche...

Je trouve que c'est dommage d'associé catégorie et tags... ça manque de lisibilité...

Moi par exemple je me sers de catégorie comme moyen d'envoyer un texte à un endroit précis de la page d'accueil. Dernier article de cette catégorie par exemple... Si tu es tout seul à ecrire des articles ça va, mais si tu as plusieurs rédacteurs qui n'y connaissent rien, c'est galère. C'est mieux si tu fais d'un coté les tags, de l'autre le choix d'une catégorie...

Egalement j'ai un soucis sur les images... il me les upload bien dans mon rep images, mais ne les affiches pas du tout..

Aujourd'hui je vais avoir le temps de regarder un peu le code et essayer de modifier quelques petits trucs...

merci

#10

Comète, le 28 janvier 2009 à 09:22 :

Je suis d'accord avec toi en ce qui concerne les tags/catégories, j'aurai peut-être du simplement nommer le modèle Tag en Category pour éviter les confusions. Cependant l'ajout d'un modèle supplémentaire pour bien différencier les mots-clé des catégories ne devrait pas être bien compliqué (merci Django !).
Pour ce qui est des images, qu'elles ne s'affichent pas dans l'interface d'admin est normal, je n'ai tout simplement pas encore ajouté cette fonctionnalité mais j'y penserai ! Par contre elle devrait s'afficher dans le détail du billet. C'est le template blog/entry_detail.html qui gère cette partie dont voici le passage concerné:

{% if object.image %}
<img class="illustration" src="{{ MEDIA_URL }}{{ object.image.url }}"/>
{% endif %}

Fais attention de bien avoir renseigné la variable MEDIA_URL dans ton settings.py

#11

leau2001, le 28 janvier 2009 à 11:24 :

As tu besoins de {{{ object.image.url }}

ne serai ce pas plutot :{{ object.image}} vu que tu mets déjà {{ MEDIA_URL }} avant ?

#12

Comète, le 28 janvier 2009 à 11:33 :

Oui j'en ai besoin car {{ MEDIA_URL }} est le dossier contenant tes images et autres media mais si tu lui crées des sous-dossiers, ce qui est souvent le cas, tu as besoin de lui associer l'url de l'image pour avoir un chemin complet.

#13

leau2001, le 28 janvier 2009 à 12:49 :

Oui en fait je n'avais pas fait de rep au dessus d'image, du coup ça perturbai un peu le truc... tout est rentré dans l'ordre...

Ce qui manque :
1 -pouvoir supprimer un billet
2 -Pouvoir authoriser ou non les commentaires sur un billet

#14

Comète, le 28 janvier 2009 à 13:18 :

La suppression d'un billet est déjà possible:
dans l'interface d'admin, clique sur le billet comme si tu voulais l'éditer. En bas à gauche du formulaire d'édition tu as un bouton "Supprimer".

Pour l'autorisation ou non des commentaires, c'est une bonne idée, je vais ajouter cela à ma liste.

Merci !

#15

leau2001, le 28 janvier 2009 à 13:20 :

Oui j'ai trouvé le supprimer, par contre je vais tenter de placer une fonction supprimer dans le liste des billets dans l'admin

#16

Raoul, le 31 janvier 2009 à 18:27 :

Hello !

Un tout grand merci pour le code source du blog. Il s'agit d'un excellent point de départ.

Cependant, j'ai lorsque j'essaie d'atteindre l'url du blog, j'obtiens cette erreur au niveau du serveur :

ImportError: No module named Blog2.urls

??

#17

Comète, le 31 janvier 2009 à 19:12 :

Salut Raoul,

visiblement tu essaies d'importer un module qu'il ne trouve pas. As-tu bien vu que j'utilisais 2 fichiers urls.py ? un à la racine et l'autre dans le dossier blog/
Je fais appel au second depuis le premier (cf: la première ligne de patterns).

#18

lol, le 5 février 2009 à 13:13 :

Encore un coup de spam maqué ;-)
Et troll qui va bientôt disparaitre ...

Vive l'échappement.

J'en profite pour remercier l'auteur de ce blog pour ses infos qui m'ont été fort utiles.

Voir blog.elyxis.net et on ne se moque pas de la récupération des feuilles CSS.

Je suis pas très doué en CSS.

Merci,
Geoffroy

#19

Comète, le 6 février 2009 à 19:25 :

Pas de problème pour le CSS Geoffroy ;) Cela dit à ta place je changerais le vert de la police du menu pour un bleu qui serait plus dans les tons de ton site...
Enfin les goûts et les couleurs comme on dit... :)

#20

Comète, le 9 février 2009 à 22:14 :

La désactivation des commentaires sur un billet est maintenant possible.

Merci à leau2001 pour la suggestion ! :)

#21

leau2001, le 13 février 2009 à 09:59 :

Comment je fais si je veux récupérer juste le dernier billet d'une catégorie par exemple...

#22

Comète, le 13 février 2009 à 10:38 :

Salut,

tu peux réaliser ceci en faisant une QuerySet via une vue spécifique (views.py).
Pour t'aider, regarde ce lien qui décrit la méthode latest()

http://docs.djangoproject.com/en/dev/ref/models/querysets/#latest-field-name-none

et celui-ci aussi:

http://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-specific-objects-with-filters

J'oubliais, tu peux aussi faire ceci directement depuis ton template:
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#last

#23

leau2001, le 13 février 2009 à 11:28 :

et comme ça c'est possible ?

def last_by_target(request,monslug):
"dernier billets appartenant a un conteneur"
c = Target.objects.get(tar_slug=monslug)
billets = Entry.objects.all().filter(target=c).order_by('-pub_date')
return render_to_response('blog/last_by_target.html', {'billets': billets[0],'target': c})

en mettant billet[0] ?

#24

Comète, le 13 février 2009 à 12:18 :

Plutôt ceci:

def last_by_target(request,monslug):
"dernier billets appartenant a un conteneur"
c = Target.objects.get(tar_slug=monslug)
billets = Entry.objects.all().filter(target=c).latest('pub_date')
return render_to_response('blog/last_by_target.html', {'billets': billets,'target': c})

#25

leau2001, le 13 février 2009 à 18:30 :

Je suis en train d'essayer template_utils, mais je n'y arrive pas :

je fais ça :

http://www.friendpaste.com/7QtUTWQIPK1wOip3EAIyqc

je pointe vers home.html et normalement je devrais avoir dans ma page mes titres de mes 5 derniers billets. mais hélas, je n'ai que "Derniers billets publiés" qui s'affiche, ou sont donc passés mes billets ? si tu as une idée, ça m'aiderai beaucoup... merci

#26

Comète, le 14 février 2009 à 10:19 :

Désolé mais je n'ai jamais utilisé template_utils.
J'essaie de limiter au maximum l'utilisation de bibliothèques externes à Django et Python car je trouve que cela rend le code plus difficile à maintenir lorsque Django évolue. Cela t'oblige à attendre que les bibliothèques que tu utilises soient compatibles avec la nouvelle version de Django. Bref, se sont des dépendances supplémentaires et je préfère me conformer aux "Batteries Included" :)
Cela dit j'avoue que certaines bibliothèques externes sont vraiment très pratiques et parfois sans équivalent dans la distribution officielle de Django.

#27

leau2001, le 14 février 2009 à 15:03 :

Je comprends alors donc voici ce que j'ai essayé de faire :

http://www.friendpaste.com/1NCjtqOyqui3Vkfvq4Ovxz,

mais j'ai toujours une erreur... pas moyen d'afficher ce que je veux en page d'accueil... Grrrr, il y a un truc que je comprend pas.... ça m'énerve !!

#28

leau2001, le 14 février 2009 à 15:38 :

c'est bon j'ai trouvé : pas de boucle {% for %} lorsqu'il y a un seul argument, en l'occurrence, un seul billet, le dernier... ;)

#29

leau2001, le 17 février 2009 à 07:35 :

Bonjour,

Il manque un petit quelque chose à ce moteur... la gestion des média... si par exemple tu veux mettre des photos ou des videos dans tes articles... insertion après sélection dans une fenetre ou s'affiche images, vidéo, et possibilité d'upload... c'est juste une idée... ;)

#30

Comète, le 18 février 2009 à 13:34 :

Oui c'est sur ma liste bien que cela ne soit pas une priorité pour moi. Cela dit, le code de ce site est fourni comme base d'apprentissage de Django ou comme base de démarrage pour créer son propre blog, libre à vous d'y ajouter les fonctionnalités qui vous intéresse. C'est d'ailleurs comme cela qu'on apprend à utiliser Django. :)

#31

leau2001, le 28 février 2009 à 07:43 :

Bonjour,

Je cherche une config pour faire une installation sous alwaysdata... un conseil ? j'utilise ton moteur de blog, alors si tu avais des petits conseils de config, (les modules à installer, les fichiers config etc... ) ça serai super sympa...

merci

#32

Comète, le 28 février 2009 à 09:18 :

Salut,

oui pas de problème, je t'envoie tout ça par mail ce week-end.

#33

leau2001, le 28 février 2009 à 10:04 :

Genial, merci, c'est possible aujourd'hui, j'ai un imperatif de mise en ligne pour demain... arf merci de ta patience

lo

#34

leau2001, le 28 février 2009 à 10:29 :

J'ai globalement réussi, sauf que je n'accede pas au style css de la console d'admin

#35

Comète, le 28 février 2009 à 12:42 :

Ok, dans mon dossier principal "giag", j'ai un dossier "public" contenant mon fichier "django.fcgi" ainsi que mon dossier "media".
A la racine du dossier "media", j'ai créé un lien "admin" pointant vers /var/lib/python/django/1.0.2/django/contrib/admin/media/

Et voilà !

#36

leau2001, le 28 février 2009 à 13:21 :

Merci et pas eu d'ennuis concernant l'entree de billet ?

genre : AttributeError at /admin/blog/entry/add/

'unicode' object has no attribute 'parent'

Request Method: POST
Request URL: http://test.sportbreizh.com/admin/blog/entry/add/
Exception Type: AttributeError
Exception Value:

'unicode' object has no attribute 'parent'

#37

leau2001, le 28 février 2009 à 13:26 :

Il semble que ce soit le markdown qui plante, lorsque je passe dans le html et que je met rien dans le markdown il sauvegarde

#38

leau2001, le 28 février 2009 à 13:38 :

c'était bien ça ;)

#39

Comète, le 28 février 2009 à 14:17 :

Oui cette erreur est due à la version de python-markdown qui est trop ancienne sur les serveurs d'Alwaysdata. Celà dit ils ne devraient plus tarder à la mettre à jour maintenant, d'après ce que m'avait dit un de leur technicien. En attendant, tu peux contourner le problème en installant le dernier module pour ton environnement. Jette un coup d'oeil ici:
http://forum.alwaysdata.com/viewtopic.php?id=446

#40

leau2001, le 28 février 2009 à 14:22 :

Oui j'ai fais ça, et ça marche... allez je continue jusqu'au prochain petit plantage ;)

merci

#41

leau2001, le 28 février 2009 à 18:50 :

cette fois je n'arrive plus à uploader des images...

#42

Comète, le 1 mars 2009 à 10:13 :

Salut,

as-tu bien créé un dossier "images" dans ton dossier media ? Si il s'appelle différement, pense à le changer dans ton models.py (option "upload_to" d'un champs ImageField). Sinon, quand tu associes une image à ton billet, est-elle bien uploadée dans ce dossier ? Si oui, le problème vient surement de tes templates...

#43

Twinsview, le 6 mars 2009 à 11:42 :

Article ntéressent.

#44

Charlie, le 11 mars 2009 à 00:11 :

Bonsoir,

J'ai trouver un autre exemple de création d'un blog avec Django et je coince sur un point qui à priori n'est pas traité dans ton exemple.

Je dois renseigner DATABASE_NAME dans settings.py car je veux utiliser sqlite3.

Le problème c'est que je ne sais pas quel chemin je dois mettre exactement...

Quelqu'un peut-il m'aider.

D'avance merci.

PS: Après moulte essais voici le message d'erreur que j'ai:

"sqlite3.OperationalError: unable to open database file"

@+

#45

Comete, le 11 mars 2009 à 21:27 :

Salut,

En fait tu peux mettre ta base de données ou tu veux. Moi je la place à l'extérieur de mon dossier d'application. Par exemple:

DATABASE_NAME = '/home/comete/projets/site/sqlitedb/giag-db'

ainsi quand tu initialiseras ta base avec un :
python manage.py syncdb
elle sera créée dans /home/comete/projets/site/sqlitedb/

C'est aussi simple que ça. ;)

#46

Charlie, le 12 mars 2009 à 12:04 :

Merci du retour.

J'ai enfin pu réaliser enfin le blog.

J'essaye maintenant de le déployer sur alwaysdata, mais là je galère encore.

Tous les exemples sont à priori donné pour linux et non windows et du coup les commandes sont à priori pas les mêmes.

J'ai beau lire le wiki de alwaysdata je ne parviens pas à m'en sortir.

Je crois que tu es très actif chez eux. Auraient-tu quelques conseils à me donner.

D'avance merci

#47

Charlie, le 12 mars 2009 à 12:16 :

J'ai aussi une autre petite question sur ton exemple.
Pourquoi settings.py n'est pas présent?
Est-ce à nous de le programmer.

Eventuellement as-tu pensé à faire un petit tuto relantant la marche à suivre pour arriver à ton résultat?

#48

Comète, le 12 mars 2009 à 20:21 :

Salut,

si tu es sous Windows (pense à tester un OS du bien -> Linux ou un BSD ;) ), tu auras besoin d'un client SSH pour te connecter aux serveurs d'alwaysdata. Tu peux pour celà utiliser PUTTY. Une fois connecté, tu peux appliquer ce qu'il y a dans le wiki car tu te trouveras de toute façon sur un serveur Linux. Si tu galères toujours, n'hésite pas à demander de l'aide sur leur forum, ils sont plutôt réactifs.
En ce qui concerne le fichier settings.py, il ne figure pas dans les sources pour plusieurs raisons:
- il est généré automatiquement à la création d'un nouveau projet Django.
- il contient des informations qui par mesure de sécurité ne doivent pas être rendues publiques (mot de passe d'accès à la base de données, clé secrète)
- il est souvent propre à une installation et ne conviendrait pas à tout le monde (chemins, type et nom de base de donnée diffèrents...). Par exemple, j'ai une copie du blog sur 3 PCs, le seul fichier qui diffère est le settings.py car je ne stocke pas forcément mes medias ou ma base au même endroit suivant les machines.
- Enfin ce fichier settings.py est suffisament commenté par défaut pour qu'on s'y retrouve assez facilement.
Pour le mini tuto décrivant le démarrage de l'appli une fois les sources récupérées, c'est une bonne idée, je vais bientôt faire un billet là-dessus.

#49

Charlie, le 12 mars 2009 à 22:49 :

Je me permets de revenir vers toi pour savoir si tu peux me donner la marche que tu as suivi (paramètres...) pour publier un éventuel blog sur alwaysdata, car là je galère grave et sur le wiki et le forum je ne trouve rien pour le moment.

(Là j'ai une erreur 500 qui se produit)

#50

Charlie, le 13 mars 2009 à 23:51 :

Impec tous les problèmes sont résolus. Il ne reste plus qu'à programmer... cool

#51

Charlie, le 15 mars 2009 à 01:46 :

Petite question supplémentaire:
* Comment et où est défini le template_source dans une application "blog"?

J'ai l'impression que c'est un chemin imposé (à priori \mon_projet\templates\blog\entry_archive.html)

Quelqu'un peut-il me confirmer ceci?

#52

Comete, le 15 mars 2009 à 10:01 :

Dans le settings.py, il y a une variable qui indique l'emplacement par défaut de tes templates. Cependant il est possible, pour une vue donnée et via le fichier urls.py, de forcer l'utilisation d'un template particulier.
Je te conseille fortement la lecture du tutoriel officiel:
http://docs.djangoproject.com/en/dev/intro/tutorial01/#intro-tutorial01

ainsi que The Django Book:
http://djangobook.com/en/2.0/

#53

Charlie, le 21 mars 2009 à 22:22 :

Hello Comete,

Je continue mon apprentissage de Django et je souhaiterai, sur mon site, offrir la possibilité à mes visiteurs de laisser des commentaires (comme tu le permets sur ton site).

J'ai la partie qui concerne ceci sur la VO du DB, mais je dois louper une étape.

Pourrais-tu me guider?

d'avance merci

#54

Geoff, le 24 mars 2009 à 17:19 :

Salut Charlie,

Il existe un module Django tout prêt qui se nome 'comment', vois dans les django.contrib

A+
Geoff

#55

Charlie, le 25 mars 2009 à 12:10 :

Effectivement j'ai trouvé ce module et après moultes essais j'ai enfin réussi à le rendre fonctionnel.

Donc tout est impec. Il reste juste quelques petits réglages à faire.

Merci

#56

astate, le 27 juillet 2009 à 05:54 :

Je cherche a configurer INSTALLED_APPS via le setting.py

Mais j'ai cette erreur lorsque je démarre le serveur :
Error: No module named feeds

#57

Comète, le 27 juillet 2009 à 08:01 :

Bonjour,

voici ce que contient mon INSTALLED_APPS:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'giag.blog',
'django.contrib.admin',
'django.contrib.comments',
'django.contrib.markup',
'django.contrib.flatpages'
)

En espérant que cela vous aide. ;)

#58

Sam, le 27 août 2009 à 11:08 :

Génial ! Superbe réalisation !

J'ai juste une petite question sur le système de commentaires : comment fais tu pour proposer un lien à l'utilisateur, après avoir posté un commentaire, pour pouvoir le visualiser ?

J'ai bien vu ton template comments/posted.html. Mais celui contient un tag {% if object %}... De mon côté, il semble que le framework de commentaires, ne fournisse jamais l'objet en question lors de l'enregistrement du commentaire. Autrement dit, impossible de récupérer son url (get_absolute_url). Il y a t il quelques paramètres à configurer quelque part afin que l'objet pour lequel le com a été posté soit fourni à la vue de validation du post.

#59

Antoine, le 27 août 2009 à 14:25 :

Bonjour, pourrais-tu mettre à disposition tes fichiers media?
J'aimerais bien travailler dessus, car je trouve le design très réussi.

#60

Comète, le 27 août 2009 à 22:22 :

A Antoine:

Voici le CSS:
http://gerard.geekandfree.org/media/css/style.css

et pour les medias, tu peux les récupérer simplement en cliquant sur la "favicon" à gauche de la barre d'adresse de Firefox -> "Plus d'informations" -> "Medias"

#61

Comète, le 27 août 2009 à 23:04 :

A Sam:

Merci du compliment et merci d'avoir mis le doigt sur un bug :)

Effectivement le lien de redirection n'apparaissait pas car "object" n'existe plus avec le nouveau système de commentaires introduit avec la version 1.0 de Django.

J'ai corrigé le tir et en même temps adapté le code du blog pour qu'il fonctionne avec Django 1.1. Télécharge de nouveau le code source et ça marchera mieux ;)

#62

Martine, le 22 octobre 2010 à 16:54 :

Je voulais vous remercier pour ce CMS très pratique ! Je l'utilise régulièrement pour des petits besoins :-)

#63

Comète, le 1 novembre 2010 à 10:04 :

Mais de rien ! :) Ca fait plaisir de savoir qu'il est utilisé ailleurs.