2010-06-07 5 views
2

Je suis passé par le processus (pénible) d'écriture d'un tag de modèle personnalisé à utiliser dans Django. Il est enregistré comme inclusion_tag afin qu'il rende un template. Cependant, cette étiquette se brise dès que j'essaie de changer quelque chose.Les balises de modèle Django sont-elles mises en cache?

J'ai essayé de changer le nombre de paramètres et de changer les paramètres en conséquence quand il est appelé. Il est clair que le nouveau code d'étiquette n'est pas chargé, car une erreur est émise indiquant qu'il y a une discordance dans le nombre de paramètres, et il est évident qu'il essaie d'appeler l'ancienne fonction.

Le même problème se produit si j'essaie de modifier le nom du modèle en cours de rendu et de modifier en conséquence le nom du modèle sur le disque. Il continue à essayer d'appeler l'ancien modèle. J'ai essayé d'effacer les anciens fichiers .pyc sans aucune chance.

Dans l'ensemble, le système agit comme s'il mettait en cache les balises de gabarit, probablement en raison de la commande register. J'ai creusé à travers des discussions sans fin essayant de savoir si c'est le cas, mais tous pourraient trouver James Bennett déclarant here que register ne fait rien. S'il vous plaît aider!

Répondre

1

Si quelqu'un d'autre rencontre cela: le mécanisme de mise en cache exacte n'est pas clair, mais le redémarrage du serveur dev django résout le problème.

2

Je suis passé par le processus (douloureux) d'écrire une étiquette de modèle personnalisé pour une utilisation dans Django

Je suis d'accord que le processus d'écriture de la balise de modèle dans django est plus complexe que nécessaire être. Mais permettez-moi de vous montrer quelques applications tierces qui, lorsqu'elles sont installées, une balise template est juste une autre fonction python (ou classe).

http://github.com/alex/django-templatetag-sugar

http://github.com/codysoyland/django-template-repl

2

Tout d'abord, je ne peux pas imaginer ce qui est compliqué sur les balises d'inclusion. Ecrire une étiquette entièrement personnalisée à partir de zéro, oui: c'est compliqué. Mais inclusion tags sont simplement trois lignes de code et un modèle - qu'est-ce qui est compliqué à ce sujet?

Deuxièmement, tous Le code Python dans votre projet Django est chargé une fois par le serveur [*], et reste jusqu'à ce qu'il soit redémarré. Le serveur dev détecte généralement les modifications et redémarre pour recharger le code, mais cela ne fonctionne pas toujours. Vous devriez prendre l'habitude de vérifier la console pour voir si elle redémarre, et le faire manuellement si nécessaire. Notez que cela n'a absolument rien à voir avec la mise en cache.

[*] à proprement parler, une fois par processus, mais le serveur de dev est de toute façon mono-processus.

+0

Le processus a été douloureux parce que j'ai rencontré l'erreur décrite ici sous "magie", qui a pris beaucoup de temps à déboguer: http://www.b-list.org/weblog/2007/dec/04/magic-tags/Il s'avère que le soi-disant ImportError a été passé en revue parce que mon nouveau répertoire templatetags/avait un fichier __init__.py vide. Il a besoin d'au moins un personnage. Qui savait. L'étiquette est en effet trois lignes, ce qui ne fait qu'ajouter à la frustration. Code que simple ne devrait pas casser! Vous avez absolument raison à propos du serveur de développement Django. Il recharge les changements de façon si constante que je ne l'ai pas considéré comme un point d'échec. – thebossman

Questions connexes