Django 开发服务器重新启动后未注册 Django 模板过滤器

Posted

技术标签:

【中文标题】Django 开发服务器重新启动后未注册 Django 模板过滤器【英文标题】:Django template filter not registered after django dev server restart 【发布时间】:2016-05-16 10:13:20 【问题描述】:

我花了太多时间试图自己解决问题,也许这里有人可以帮助我。我正在构建一个更大的 django 应用程序,但删除了除了突出问题的代码之外的所有内容。

我定义了两个自定义模板标签:

edb/templatetags/edb_extra.py:

register = template.Library()

@register.inclusion_tag('edb/templatetags/event_tile.html')
def render_event_tile(event):
    return 'event':event

@template.defaulttags.register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

带有链接的 html edb/templatetags/event_tile.html:

<div>
    <h5> RENDER:  event.name  </h5>
</div>

我通过 edb/views.py 处理请求:

@login_required
def my_view(request):
    events = Event.objects.all()
    myevent = events[0]
    sorted_events = 'mykey': myevent
    return render(request, "edb/using_tags.html", 'sorted_events':sorted_events, 'event':myevent)

最后是 edb/using_tags.html:

% load edb_extra %

<!doctype html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <div class="main-panel">
            % render_event_tile event %
             sorted_events|get_item:'mykey' 
        </div>
    </body>
</html>

django dev 服务器重启后第一次处理时,此代码会产生以下错误消息:

TemplateSyntaxError at en/edb/using_tags
Invalid filter: 'get_item'

当我点击浏览器后退按钮并重复请求时,它工作正常。它也适用于所有后续请求,直到需要重新启动服务器(例如,我更改了视图代码)。

此外,如果我删除 sorted_events|get_item:'mykey' ,一切从一开始就正常工作,因此似乎 edb_extra.py 正在按时正确处理。但不知何故,inclusion_tag 正在注册,而过滤器没有。

【问题讨论】:

【参考方案1】:

尝试在装饰器中使用register 模板库:

@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

【讨论】:

谢谢,我花了好几个小时试图看看发生了什么,在 10 分钟内得到了答案。它有效。

以上是关于Django 开发服务器重新启动后未注册 Django 模板过滤器的主要内容,如果未能解决你的问题,请参考以下文章

使用AppleScript重新启动Django开发服务器

使用AppleScript重新启动Django开发服务器

使用AppleScript重新启动Django开发服务器

使用AppleScript重新启动Django开发服务器

使用AppleScript重新启动Django开发服务器

使用AppleScript重新启动Django开发服务器