web-dev-qa-db-fra.com

django: filtre non valide

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
22
vito huang

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/

18
Ken Cochrane

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

16
mkiesner

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!

12
Meilo