"TemplateSyntaxError: Invalid filter:"; benutzerdefinierte django template-filter basierend auf django-docs kaputt, aber template-tags arbeiten
Habe ich eine template-filter basiert auf dem django-docs an https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/. Für das Leben von mir ich kann nicht sehen, einen Unterschied in meinem Gebrauch und die ihrigen, und bin langsam verrückt. Ich habe einen tag bekam ich in einem forum als solche:
myproject/index/templatetags/add_get_parameter.py:
from django.template import Library, Node, resolve_variable
register = Library()
class AddGetParameter(Node):
def __init__(self, values):
self.values = values
def render(self, context):
req = resolve_variable('request', context)
params = req.GET.copy()
for key, value in self.values.items():
params[key] = value.resolve(context)
return '?%s' % params.urlencode()
@register.tag
def add_get(parser, token):
pairs = token.split_contents()[1:]
values = {}
for pair in pairs:
s = pair.split('=', 1)
values[s[0]] = parser.compile_filter(s[1])
return AddGetParameter(values)
Diese, add_get
auf Zeilen 8-9, arbeiten, in der Erwägung, dass shorten_title
auf der Linie 4 nicht funktioniert:
myproject/templates/index/silo.html:
{% load bootstrap add_get_parameter extras %}
...other stuff...
{% for article in articles %}
<div class="col-md-4 article-link">
<div class="panel panel-default hover">
<div class="panel-heading"><h4 class="url-link">{{ article.title|shorten_title }}</h4></div>
<div class="panel-body">
<p> <span class="url-text">{{ article.url }}</span></p>
<a href="{% url 'index:edit-article' article.id %}"><div class="article_button">Edit</div></a>
<a href="{% add_get archive=article.id %}"><div class="article_button"><p>Archive</p></div></a>
<a href="{% add_get delete=article.id %}"><div class="article_button">Delete</div></a>
<div style="margin-top:8px;">
{% for tag in article.tags.all %}
<p class="tag">{{ tag.name }}</p>
{% endfor %}
</div>
</div>
</div>
</div>
{% endfor %}
Hier ist der Bösewicht:
from django.template import Library
register = Library()
@register.filter
def shorten_title(title):
length = len(title)
new = title
if length > 65:
new = title[0:65] + "..."
return new
register.filter('shorten_title', shorten_title)
Er war so unhöflich ich doppelt registriert ihn, nur um zu sehen, was passiert (er arbeitet nicht registriert, einmal als Dekorateur oder danach, und nicht die Arbeit doppelt angemeldet).
{{ article.title }}
funktioniert, aber {{ article.title|shorten_title }}
bricht die Seite mit:
django.template.base.TemplateSyntaxError
TemplateSyntaxError: Invalid filter: 'shorten_title'
'Index' ist definitiv registriert und arbeiten, und die Seite funktioniert, wenn ich den filter löschen aus, dass Artikel.title-tag.
Regel, wenn ich einen hartnäckigen Fehler, ich verpasste etwas klein, aber die docs Wort für Wort hat mich verblüfft (ich habe geschrieben, mehrere Filter arbeiten vor). Ist dieser filter schlecht, oder ist es vielleicht etwas anderes in meiner Seite, die das Problem verursacht? Dank
- Also, wo ist das
shorten_title
code? Welche Datei? Sind Sie Import dieser Datei in die Vorlage? (Beachten Sie auch, sollten Sie nicht verwenden die beiden die Raumausstatter und die direkteregister.filter(..)
Anruf: wählen Sie eine oder das andere.) - Titel kürzen war extras.py. Ich habe buchstäblich Ausschneiden und einfügen den code in eine neue Datei ohne tags (nur diesen einen filter...), und jetzt funktioniert es. hätte es sich um eine dieser seltsamen pyc Dinge, wo du musst alle löschen Ihre pyc, oder vielleicht auch template tags und Filter sollte nicht in der gleichen Datei? nach dem django Beispiele zweimal, einen Tag arbeitet und eines Tages wird es nicht, ist unverständlich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie sicherstellen, dass Sie die Datei importieren mit
register.filter('shorten_title', shorten_title)
bevor Sie Rendern der Vorlage. Seit diesem Anruf passiert, außerhalb aller Funktionen, die es ausgeführt wird, wenn Sie das Modul importieren. Dies hat den Nebeneffekt, registrieren Sie, so dass es verfügbar sein wird, in Ihren Vorlagen danach.register.filter('shorten_title', shorten_title)
direkt unter dem filter in der gleichen Datei (index/templatetags/extras.py)from index.templatetags import extras
? Ich lade extras in der Vorlage wie oben in der .html-Datei{% load bootstrap add_get_parameter extras %}
, etwas sehr ähnliches gilt für die shorten_title. Ich bin nicht ganz sicher, was der beste Weg in Django ist, weil ich die Beantwortung dieser Frage basiert darauf, dass eine ähnliche Erfahrung mit Fläschchen.