35 Stimmen

django: Ungültiger Filter

Ich habe einen Artikel app und versuchen, einen benutzerdefinierten Filter zu machen, ich habe ein Verzeichnis namens templatetags in Artikel app, und ein tags.py in diesem Verzeichnis, hier ist die Verzeichnisstruktur.

-manage.py(f)
-settings.py(f)
-articles(d)
 - templatetags(d)
  - tags.py(f)

Bei den Vorlagen haben die Artikel ihr eigenes Verzeichnis, alle Artikelvorlagen gehen von einer base.html-Vorlage aus, hier ist die Vorlagenstruktur.

-base.html(f)
-articles(d)
 -index.html(f)

Ich lade die Tags in base.html {% load tags %} und verwende den benutzerdefinierten Filter in index.html und erhalte den Fehler "Ungültiger Filter".

tags.py

from django import template                                                                                                                                                        
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def space2Dash(s):
    return s.replace(' ', '_');

Ich kann einfach nicht herausfinden, was ich falsch gemacht habe.

bearbeiten: Ich habe den Filternamen in abcfilter.py und ich habe die Artikel-App in meinem settings.py

artikel/index.html

 {% load abcfilter %}
 {{ "foo bar"|space2dash }}

den Fehler:

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

38voto

mkiesner Punkte 615

Nur als Hinweis: Ich habe das Problem gelöst, indem ich die

{% load ... %}

von der Basisschablone zur Betonschablone. Siehe auch diesen Beitrag https://stackoverflow.com/a/10427321/3198502

23voto

Ken Cochrane Punkte 72269

Entfernen Sie zunächst das Semikolon nach "replace".

Haben Sie eine Datei namens __init__.py (dies soll 2 Unterstriche vor und nach init haben, schwer zu formatieren im Editor.) unter dem templatetags Verzeichnis?

Hier ist eine gute Seite mit vielen Informationen, falls Sie noch nicht nachgeschaut haben.

http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

22voto

Meilo Punkte 3238

Ich bin mit diesem Problem fast durchgedreht und keine der oben genannten Antworten hat mir geholfen.

Wenn Sie mehrere Anwendungen haben, stellen Sie sicher, dass die Dateinamen, die Ihre benutzerdefinierten Tags/Filter enthalten, eindeutig sind, vorzugsweise app_name_filters.py . Andernfalls wird Django nur die benutzerdefinierten Filter aus der App laden, die es als erstes für passend hält!

3voto

Amjad Al Taleb Punkte 81

Um das Laden des Moduls in jeder Vorlage zu vermeiden, verwenden Sie {% load MODULE_NAME %} können Sie es als 'builtin' en settings.py :

TEMPLATES = [
    {
        'OPTIONS': {
            ...
            ,
            'builtins': [
                ...
                'APP_NAME.templatetags.MODULE_NAME',
                ]
        },
    },
]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X