从 jinja 呈现的 html 模板生成 CSV 表 - 如何传递 python 类对象?

我正在尝试构建一个简单的 flask Web 应用程序:
A) 用关键字搜索一个小的 postgres 数据库
B) 返回所有相关条目
C) 将条目呈现给浏览器
D) 用户可以将条目下载到 csv 文件中

我正在努力将 jinja 模板中的 python 对象传递到 python 函数中。当我将对象从 jinja 模板传递给函数时,该对象成为每个索引字符串的单个元素,不再具有属性 result.operation_nameresult.project_num 。我用过

<a href="{{ url_for('core.downloadsearch',result=result) }}">Download Search</a>

传递对象result

这是一个问题,因为我想使用对象 result 的属性将不同的变量划分到 CSV 的单独单元格中。

或者,我通过 jinja 呈现的 html 将查询传递给生成 csv 的 python 函数 - 它有效,但是,我不喜欢为单个任务两次查询数据库。感觉效率不高。

如何在不将其转换为字符串的情况下成功地将 python 对象从 jinja 传递给 python 函数?或者有没有更好的完全不同的数据流?

代码如下:

设置 db.Model:

class ProjectInfo(db.Model):
    __tablename__ = 'project_info'

    id = db.Column(db.Integer,primary_key=True,server_default=db.FetchedValue())
    operation_name = db.Column(db.String,nullable=False,unique=True)
    project_num = db.Column(db.String(10),unique=True)

    def __init__(self,operation_name,project_num):
        self.operation_name = operation_name
        self.project_num = project_num

    def __repr__(self):
        return f"{self.operation_name},{self.project_num}"

查询数据库并传递给jina2模板list.html:

@core.route('/search',methods=['GET','POST'])
def search():
       search_word = form.search.data
       result = ProjectInfo.query.filter(ProjectInfo.operation_name.contains(search_word)).all()
       return render_template('list.html',result=result)

在 jinja 渲染的 list.html 中,渲染 results 内容并传递给 downloadsearch(csv 生成函数):

{% block content %}
<div>
  <h3>
    <a href="{{ url_for('core.downloadsearch',result=result) }}">Download Search</a>
  </h3>
<table>
<tbody>
 {% for row in result %}
  <tr><td>{{row.operation_name}}</td><td>{{row.project_num}}</td></tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

在python函数中生成csv文件:

def downloadsearch(result):
    #result is now a single-element indexed string
    #take result input and generate some csv
nxg2062632 回答:从 jinja 呈现的 html 模板生成 CSV 表 - 如何传递 python 类对象?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/549.html

大家都在问