如果路径存在,则用于有条件地呈现或包含另一个模板的模板标记

Posted

技术标签:

【中文标题】如果路径存在,则用于有条件地呈现或包含另一个模板的模板标记【英文标题】:Template tag for conditionally rendering or including another template if the path or paths exist 【发布时间】:2015-11-05 07:02:05 【问题描述】:

我正在 Django 应用程序中实现一个通用下拉菜单。在大多数情况下,这些页面是通用的,并且它们具有简单的通用“子”菜单。但是在某些情况下,我希望能够根据页面 slug (page.slug) 包含或呈现一组特殊的子项或来自完全不同模板的自定义内容。

我考虑过实现包含标签,但我不确定如何在模板标签中执行此操作。我知道在视图中你可以这样实现它:

blog_post = get_object_or_404(blog_posts, slug=slug)
...
templates = [u"blog/blog_post_detail_%s.html" % str(slug), template]
return render(request, templates, context)

我的标签设计模式很简单:

    查看 pages/SLUG/dropdown.html 试试 pages/dropdown_SLUG.html 如果这些文件都不存在,则不渲染。

如何通过模板标签做到这一点?包含标签是正确的方式,还是 render_tag?

【问题讨论】:

那么您是说如果他们是一组特殊的子项,则在下拉菜单中显示它,如果不是,则显示通用下拉菜单。 不,基本上我想渲染一个特殊的模板/如果路径存在的话,我想从下拉菜单模板中包含它,例如为可能有额外内容的网站区域渲染一个自定义菜单不仅仅是一棵页面链接树。 【参考方案1】:

这是我想出的解决方案:

@register.render_tag
def page_menu_special(context, token):
    page = None
    template_name = None
    menu_templates = []

    parts = token.split_contents()[1:]
    for part in parts:
        part = Variable(part).resolve(context)
        if isinstance(part, str):
            template_name = part
        elif isinstance(part, Page) or isinstance(part, CustomPage):
            page = part

    if page and page.slug:
        page_template = str(page.slug) if page.slug != home_slug() else "index"
        method_template = page.get_content_model().get_template_name()

        menu_templates.extend([
            u'pages/menus/dropdown_%s.html' % (page_template),
            u'pages/menus/dropdown/%s.html' % (page_template),
        ])

        if method_template:
            menu_templates.append(method_template)

    if template_name:
        menu_templates.insert(0, template_name)

    try:
        t = select_template(menu_templates)
        return t.render(Context(context))
    except TemplateDoesNotExist:
        return u''

它是 Mezzanine 特有的,但逻辑可以重用:

    构建潜在模板的路径。 将列表传递给 select_template 如果不存在则捕获异常,并返回空的或合适的渲染内容。

我仍在尝试从 within 这个定义中找出如何默认为 another 模板标签。所以我可以调用page_menu_special,如果这个失败,它会恢复为使用相同参数调用page_menu,这样可以为我们节省一个if/else 块。

【讨论】:

以上是关于如果路径存在,则用于有条件地呈现或包含另一个模板的模板标记的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一列中的单元格值有条件地填充熊猫列

如果记录存在于另一个表中,则条件格式详细信息行

如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号

函数后的条件渲染 - VueJS [重复]

如果前一列包含值,则有条件地填充列?

如何有条件地要求使用 AngularJS 进行表单输入?