我正在尝试构建一个简单的 flask Web 应用程序:
A) 用关键字搜索一个小的 postgres 数据库
B) 返回所有相关条目
C) 将条目呈现给浏览器
D) 用户可以将条目下载到 csv 文件中
我正在努力将 jinja 模板中的 python 对象传递到 python 函数中。当我将对象从 jinja 模板传递给函数时,该对象成为每个索引字符串的单个元素,不再具有属性 result.operation_name
和 result.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