我花了太多时间试图自己解决这个问题,也许这里有人可以帮助我。我正在构建一个更大的 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 开发服务器重新启动后第一次处理时会产生以下错误消息:
TemplateSyntaxError at en/edb/using_tags
Invalid filter: 'get_item'
当我点击浏览器后退按钮并重复请求时,它工作正常。它也适用于所有后续请求,直到需要重新启动服务器(例如,我更改了视图代码)。
此外,如果我删除{{ sorted_events|get_item:'mykey' }}
,一切从一开始就正常工作,因此似乎 edb_extra.py 正在按时正确处理。但不知何故,inclusion_tag 正在注册,而过滤器没有。