Bonjour,
Je fais mes premier pas avec Django avec un petit site perso. Dans le cahier des charges, je veux que la rédaction d’un article puisse se faire entièrement en markdown. La flemme de coder un éditeur graphique (qui nécessitera en plus que je me mette au Javascript) pour au final un truc moins pratique à utiliser que du markdown. J’ai installé l’extension django-markdownx. Ça marche très bien.
Cela dit, j’ai un problème lorsque je veux insérer des médias dans un article :
J’ai commencé par les images. L’extension autorise la syntaxe ![…](… "…")
.
Ensuite j’ai créé un modèle image dans la base de données qui me permet d’uploader directement les images, avec un override de la fonction save() qui me permet d’appliquer une petite optimisation sur ladite image, avant de la stocquer dans le répertoire /media/images.
Là se pose un premier problème. Comment faire référence en markdown à une image stockée dans la BDD ? Actuellement, je contourne le problème en utilisant directement le lien « /media/images/mon_images.webp » dans la balise markdown. Ce qui dans l’absolu me convient, même si c’est un peu verbeux.
Par contre du coup ma table Image ne me sert à rien : pas de sélection des images d’un article, ou d’articles utilisant une image donnée, pas de mise à jour de l’article si je ré-upload une image modifié dans la table, etc.
Je peux bien sûr rajouter un champ ManyToMany dans le modèle Article, mais avec infraction au principe DRY, et risque d’incohérence (et toujours le problème de la mise à jour automatique de l’article).
Ensuite viens le cas des vidéos et des sons : il n’y a pas de syntaxe markdown pour les balises <video>
et <audio>
.
Pareil, possibilité d’écrire les balises en toutes lettres. C’est moche et verbeux. Possibilité de créer un parseur custom et d’y faire appel dans le save()
de la classe Article. Ça passe. Mais ensuite on se retrouve avec le même problème que pour la classe/table Image. Sauf qu’en plus il n’y a pas de champ VideoField et AudioField dans Django.
Je peux donc remplacer la classe Image avec son ImageField par une classe Media avec un FileField, ce qui encore une fois ne résout pas les problèmes de liens entre articles et médias et oblige en plus à une détection plus poussée du média en question.
Bref :
Je ne trouve pas de solution qui me parait propre. Quoique je fasse, j’ai toujours l’impression de bidouiller. C’est pourquoi avant de me lancer tête baisser dans mes bidouillage, je préfère poser la question sur un forum à des développeurs plus expérimentés :
Si vous étiez face à cette problématique, comment vous y prendriez-vous ?
Merci à ceux qui ont pris le temps de me lire.
EDIT :
Bon pour les images en fait, django-markdownx permet le glissé-déposé. Il faut juste corriger un bug en attendant que la prochaine release sorte.
Pour le moment je l’ai fait à la main en éditant directement le fichier venv/lib/python3.10/site-packages/markdownx/view.py.
Question 1 : y-a-t-il une méthode plus propre pour patcher le module ? Je ne suis pas certain que ça fasse partie des bonnes pratiques d’éditer directement le fichier du module.
ensuite, je pense que l’idéal serait d’overrider le parseur de markdownx pour pouvoir glisser-déposer n’importe quel fichier, puis adapter les balises en fonction de l’extension.
Question 2 : comment on fait ça ?