“TemplateSyntaxError:无效筛选器:”;基于Django文档的自定义Django模板筛选器已损坏,但模板标记仍在工作”

2024-06-06 04:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/有一个基于django文档的模板过滤器。就我这一辈子而言,我看不出我的用法和他们的有什么不同,慢慢地就要发疯了。我在一个论坛上得到了一个工作标签:

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)

第8-9行的add_get有效,而第4行的shorten_title无效:

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>&nbsp;<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 %}

这是维莱恩:

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)

他太粗鲁了,我给他做了两次登记,只是想看看会发生什么(他没有做过一次装修登记,也没有做过两次登记)。

{{ article.title }}可以工作,但是{{ article.title|shorten_title }}用以下内容打断了页面:

django.template.base.TemplateSyntaxError
TemplateSyntaxError: Invalid filter: 'shorten_title'

“Index”肯定已经注册并且可以正常工作,当我从article.title标记中删除筛选器时,页面就可以正常工作。

通常,当我遇到一个顽固的错误时,我会漏掉一些小错误,但是逐字逐句地遵循文档会让我感到困惑(我以前写过几个有效的过滤器)。这个过滤器坏了吗,或者我的页面中可能有其他东西导致了这个问题?谢谢


Tags: djangoselfdivregisteraddforgettitle