J'ai une application d'article et j'essaie de créer un filtre personnalisé, j'ai un répertoire appelé templatetags dans l'application article et un tags.py dans ce répertoire, voici la structure du répertoire.
-manage.py(f)
-settings.py(f)
-articles(d)
- templatetags(d)
- tags.py(f)
Sur les modèles, les articles ont leur propre répertoire, tous les modèles d'articles s'étendent à partir d'un modèle base.html, voici la structure du modèle.
-base.html(f)
-articles(d)
-index.html(f)
J'ai chargé les balises dans base.html {% load tags%} et utilisé le filtre personnalisé dans index.html et j'ai obtenu l'erreur de filtre non valide.
tags.py
from Django import template
from Django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter
@stringfilter
def space2Dash(s):
return s.replace(' ', '_');
Je n'arrive pas à comprendre ce que j'ai fait de mal.
edit: j'ai changé le nom du filtre en abcfilter.py
et j'ai l'application article chargée dans mon settings.py
articles/index.html
{% load abcfilter %}
{{ "foo bar"|space2dash }}
l'erreur:
Request Method: GET
Request URL: http://localhost:8080/articles/
Django Version: 1.2.5
Exception Type: TemplateSyntaxError
Exception Value:
Invalid filter: 'space2dash'
Exception Location: ***/lib/python2.7/Django/template/__init__.py in find_filter, line 363
Python Executable: /usr/local/bin/python
Python Version: 2.7.1
Server time: Sun, 10 Apr 2011 07:55:54 -0500
Tout d'abord, supprimez le point-virgule après votre remplacement.
Avez-vous un fichier appelé __init__.py
(c'est supposé avoir 2 traits de soulignement avant et après init, difficile à formater dans l'éditeur.) sous le répertoire templatetags?
Voici une bonne page avec beaucoup d'informations si vous n'avez pas encore regardé.
http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
Juste pour référence, j'ai résolu le problème en déplaçant
{% load ... %}
du modèle de base au modèle concret. Voir aussi ce post https://stackoverflow.com/a/10427321/3198502
J'étais presque devenu fou avec ce problème et aucune des réponses ci-dessus n'a aidé.
Si vous avez plusieurs applications, assurez-vous que les noms de fichiers contenant vos balises/filtres personnalisés sont uniques, de préférenceapp_name_filters.py
. Sinon Django ne chargera que les filtres personnalisés de l'application qu'il trouve en premier!