如何从Flask-SQLAlchemy分页结果中读取Document模型的text_location列?
解决Pagination对象无text_location属性的问题
嘿,这问题我熟~你之所以会报错,核心原因是**paginate()返回的不是单个Document实例,而是一个Pagination分页对象**,这个对象本身没有text_location属性,它的items属性才装着当前页的所有Document实例。
给你几个具体的解决办法:
1. 模板里遍历分页的items列表
因为page_views.items是当前页的Document实例集合,你需要遍历它来访问每个实例的text_location:
{% for document in page_views.items %} <p>文件路径:{{ document.text_location }}</p> {# 如果你要读取文件内容,不建议直接在模板里写open逻辑,看下面的建议 #} {% endfor %}
2. 建议:在视图层提前读取文件内容
模板的职责应该是渲染展示,复杂的文件IO操作放在视图函数里更合理。你可以在视图里先把每个文档的内容读出来,再传给模板:
page_views = Document.query.paginate(page, 1, False) # 给每个Document实例添加content属性,存储文件内容 for doc in page_views.items: try: with open(doc.text_location, 'r', encoding='utf-8') as f: doc.content = f.read() except FileNotFoundError: doc.content = "文件不存在或路径错误"
然后模板里直接用:
{% for document in page_views.items %} <p>文件路径:{{ document.text_location }}</p> <div>{{ document.content }}</div> {% endfor %}
3. 单条数据的快捷写法
因为你设置了每页只显示1条数据(paginate第二个参数是1),也可以直接取items里的第一个元素:
{% if page_views.items %} {% set current_doc = page_views.items[0] %} <p>当前文件路径:{{ current_doc.text_location }}</p> {% else %} <p>没有找到相关文档</p> {% endif %}
内容的提问来源于stack exchange,提问作者user4700847
相关产品推荐
相关产品推荐

