我在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> <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标记中删除筛选器时,页面就可以正常工作。
通常,当我遇到一个顽固的错误时,我会漏掉一些小错误,但是逐字逐句地遵循文档会让我感到困惑(我以前写过几个有效的过滤器)。这个过滤器坏了吗,或者我的页面中可能有其他东西导致了这个问题?谢谢
在呈现模板之前,您需要确保使用
register.filter('shorten_title', shorten_title)
导入文件。由于该调用发生在任何函数之外,因此在导入模块时将运行该调用。这样做的副作用是注册它,以便以后可以在模板中使用它。相关问题 更多 >
编程相关推荐