当前位置: 首页 > 知识库问答 >
问题:

动态导航条元素-从Flask传递到Jinja-继承的布局模板

黄靖
2023-03-14

环境:Python 3.6,Flask 1.02,Jinja2

目的:

  • 在layout.html(由content.html扩展)中创建动态菜单
  • 但动态元素的url_for经常需要传递参数

问题声明:如何在呈现模板时传递Jinja模板中url_for的参数?

我觉得我需要jinja中str().format的语法。

我试图:

1.将每个部分作为单独的值传递:

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
return render_template('content1.html', menus=menus]

在jinja中,我试着把它叫做:(我也试过不加号和双引号)

{{ url_for(func_name), param_name+ "=" + param_val }}

在呈现过程中,它给出了url_for()的错误,它接受了1个位置参数,但给出了2个

2.尝试使用{%set var_name:passed_variable%}

建立在服务器端定义的菜单的第一个版本上,我尝试在Jinja中设置变量,但也失败了。

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
    return render_template('content1.html', menus=menus]

金贾

{% for menu in menus %}
{% set url = menu.get('url') %}
{% set param = menu.get('param') %}
{% set value = menu.get('param_val') %}
{% url_for(url, param + "=" + value %}

但它也没有奏效。如果给出url_for语法的param(而不是硬连接的字符串),就不能添加参数。

3.尝试将url_for的全部内容作为字符串传递:

menus={'url_string': " 'func_name', param_name=param_value"}

但是它又失败了,因为url_for语法将整体放在撇号之间,我不需要在末尾使用。

我浏览了一些参考资料。烧瓶上下文处理器

如果我为每个内容页面创建每个导航条的另一个模板,它就可以工作了--不过,通过这个移动,我可以简单地将导航条移动到内容页面中。然而,这似乎很乏味。堆栈溢出主题

因此问题:我怎样才能通过

param_id=paramval['id']

用于呈现过程中的url_for语法

{{ url_for('edit_question', param_id=paramval['id']) }}

代码/结构stg如下所示:layout.html

<html>
<body>
    {% for menu in menus %}
        {% for key, value in menu.items() %}
            <a href="{{ url_for(value) }}" >
                {{ key }}
            </a>
        {% endfor %}
    {% endfor %}
{% block content %}

{% endblock %}
</body>
</html>

Content1.html

{% extends 'layout.html' %}
{% block content %}
 content
{% endblock %}

内容2.html

{% extends 'layout.html' %}
{% block content %}
 content
{% endblock %}

app.py

@app.route('/')
def index():
    menus = [{'menu_title1': 'menu_func_name1'}]
    return render_template('content1.html', menus=menus)

@app.route('/menu_details/<int:menu_nr>')
def show_details_of_menu(menu_nr):
    menus = [{'menu_title3': 'menu_func_name3', 'menu_param_name': 'menu_param_value'} 
    return render_template('content2.html', menus=menus)

很抱歉这堵墙的短信..

共有1个答案

蔡鹏程
2023-03-14

叹息..几个小时后,我才找到了如何构造语法。希望能帮助到别人!

呈现期间:

menus = [{'url': 'func_name', 'menu_title': 'title', 'parameters': {'param1': param1_value}}]
return render_template('context.html', menus=menus]

在Jinja中,我调整了语法以管理不需要参数的情况:

            {% for menu in menus %}
                {% if menu.get('parameters').items()|length > 0 %}
                    <a href="{{ url_for(menu.get('url'), **menu.get('parameters')) }}">
                        {{ menu.get('menu_title') }}
                    </a>
                {% else %}
                    <a href="{{ url_for(menu.get('url')) }}">
                        {{ menu.get('menu_title') }}
                    </a>
                {% endif %}
            {% endfor %}

null

 类似资料:
  • 问题内容: 如何从此布局xml中获取元素myButton 并将其放在我选择的布局中(通过代码)? 解决方案(thx aromero) 问题答案:

  • 主要内容:表格导航或标签,实例,胶囊式的导航菜单,实例,实例,两端对齐的导航,实例,禁用链接,实例,下拉菜单,实例,实例,更多导航元素组件实例本章我们将讲解 Bootstrap 提供的用于定义导航元素的一些选项。它们使用相同的标记和基类 .nav。Bootstrap 也提供了一个用于共享标记和状态的帮助器类。改变修饰的 class,可以在不同的样式间进行切换。 表格导航或标签 创建一个标签式的导航菜单: 以一个带有 class .nav 的无序列表开始。 添加 class .nav-tabs。

  • 问题内容: 说我有一个类的2种不同的实现 如何动态地让某个3rd类继承自一个或基于此类的东西? 问题答案: 只需将类对象存储在变量中(在下面的示例中,其名为),然后在语句的基类规范中使用该变量。

  • 问题内容: 我知道曾有人问过这个问题,但是在将其标记为重复之前,我想告诉您我的情况与在互联网上发现的情况有些不同。 我正在构建和嵌入脚本,人们可以将其放在自己的网站上。此脚本创建一个具有一定宽度/高度的div,并在其中包含一些信息。 我的问题是某些网站声明了div样式,这些样式也被我的div继承。 例如: 因此,如果我没有为div设置任何背景色,即使我不想要它也将显示为红色。 我唯一能采用的解决方

  • 问题内容: 标题几乎说明了一切,但这是一个示例。 假设我有一个CSS“加载微调器”,如下所示: 我想为此添加一个伪元素-例如,在before或after之后。 是否可以确保伪元素不会继承动画,或者伪元素必须 始终 采用父元素所拥有的动画? 问题答案: 由于伪元素是父元素的子元素,因此只要父元素具有动画,它将继续旋转。即使在伪元素上进行设置也无效。 使其看起来好像孩子没有动画的唯一方法是反转效果,如

  • 问题内容: 我想我缺少了一些东西,但无法弄清楚是什么。 基本上,我试图将对象传递给模态,如下所示,但是我没有获取传递的对象,而是获取null …所以我认为范围存在问题,但是我是Angular的新手,需要帮助。 控制者 视图 问题答案: 我建议您传递自己的控制器的,而不要再次传递它,这样做可以删除也。 否则,您需要创建一个新控制器并在打开它时分配该控制器。