django - 如何从变量中动态调用 Django 模板标签
问题描述
我正在尝试允许使用动态模板标签。具体来说,我有一个在代码与模板中定义的菜单设置。我想将菜单标签呈现为{{ request.user }}
. 那么如何在 Python 中将其定义为字符串,并允许模板按预期解析和呈现字符串。不仅是变量,还有模板标签 ( {% provider_login_url 'google' next=next %}
)。
我错过了什么?
用代码更新:
我专门用 来设计我的菜单django-navutils
,但这并不重要(基本上这个包只存储定义的数据,然后使用模板来呈现它)。
from navutils import menu
top_horizontal_nav = menu.Menu('top_nav')
left_vertical_nav = menu.Menu('left_nav')
menu.register(top_horizontal_nav)
menu.register(left_vertical_nav)
sign_in = menu.AnonymousNode(
id='sign_in',
label='Sign In',
url='{% provider_login_url "google" next=next %}',
template='nav_menu/signin_node.html',
)
user = menu.AuthenticatedNode(
id='user_menu',
label='{{ request.user }}',
url='#',
template='nav_menu/username_node.html'
)
top_horizontal_nav.register(sign_in)
top_horizontal_nav.register(user)
我想做的是现在'{{ request.user }}'
在我的模板中呈现这些字符串值()
{% load navutils_tags %}
<li
class="{% block node_class %}nav-item menu-item{% if node.css_class %} {{ node.css_class }}{% endif %}{% if is_current %} {{ menu_config.CURRENT_MENU_ITEM_CLASS }}{% endif %}{% if has_current %} {{ menu_config.CURRENT_MENU_ITEM_PARENT_CLASS }}{% endif %}{% if viewable_children %} has-children has-dropdown{% endif %}{% endblock %}"
{% for attr, value in node.attrs.items %} {{ attr }}="{{ value }}"{% endfor %}>
<a href="{{ node.get_url }}" class="nav-link"{% for attr, value in node.link_attrs.items %} {{ attr }}="{{ value }}"{% endfor %}>{% block node_label %}{{ node.label }}{% endblock %}</a>
{% if viewable_children %}
<ul class="{% block submenu_class %}sub-menu dropdown{% endblock %}">
{% for children_node in viewable_children %}
{% render_node node=children_node current_depth=current_depth|add:'1' %}
{% endfor %}
</ul>
{% endif %}
</li>
那么,对于上面我正在渲染的内容{{ node.label }}
,我怎样才能将存储的值node.label
实际解析为一个request.user
?这同样适用于 value 的 URL {% provider_login_url "google" next=next %}
。
解决方案
您可以创建自定义模板标签并呈现它们。像这样
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def render_nested(context, template_text):
# create template from text
tpl = template.Template(template_text)
return tpl.render(context)
然后在模板中
...
<a href="{{ node.get_url }}" class="nav-link"
{% for attr, value in node.link_attrs.items %} {{ attr }}="{{ value }}"{% endfor %}>
{% block node_label %}{% render_nested node.label %}{% endblock %}
</a>
...
尚未测试,但我认为它会工作。
更多关于模板:https
://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context
更多关于自定义标签:https ://docs.djangoproject.com/en/dev/howto /custom-template-tags/#writing-custom-template-tags
推荐阅读
- azure - Azure 容器实例 - .net sdk - 更改环境变量并重新启动任务容器
- postgis - osm2pgsql (v. 1.4.0) "Unknown option -- t" (使用错误)
- mongodb - 如何对同一集合中不同文档的值求和?
- androidx - 如何处理由创建 EncryptedSharedPreferences 引起的 KeyStoreException?
- angular - 要清除角度应用程序的缓存,哪种方法最好在生产中使用角度 10
- typescript - 编写一个类型安全的函数,它接受一个任意对象并生成一个 CSV 字符串
- url - MediaManager.Forms UWP,播放本地视频时路径无效错误
- java - 使用 cmd 在 google chrome 中打开文件而不切换到新选项卡
- java - org.openqa.selenium.NoSuchFrameException:使用 Selenium 和 Java 在模式对话框中查找元素时无法定位框架
- pytorch - 不能用进口的本地类腌制