Flask-Admin:如何在非管理路由页面添加数据库视图
在自定义Flask页面中集成Flask-Admin的编辑/删除功能
要在你现有的/daten页面里添加类似Flask-Admin的数据表编辑、删除功能,有两种实用方案,你可以根据需求选择:
方案一:复用Flask-Admin的现有视图(推荐)
这种方法不用重复造轮子,直接利用Flask-Admin已经实现好的编辑、删除逻辑和权限控制,只需要在页面模板里添加对应操作的按钮即可。
步骤1:配置针对U_Daten的ModelView
首先,创建(或确认已存在)一个Flask-Admin的ModelView,并做好权限控制,确保用户只能操作自己的数据:
from flask_admin.contrib.sqla import ModelView from flask_login import current_user from your_app.models import U_Daten # 替换成你的模型导入路径 class UDatenModelView(ModelView): # 配置要显示的字段(根据你的模型调整) column_list = ('date', '字段1', '字段2') # 开启编辑和删除权限 can_edit = True can_delete = True # 仅允许登录用户访问 def is_accessible(self): return current_user.is_authenticated # 过滤数据:只显示当前用户的条目 def get_query(self): return super().get_query().filter(U_Daten.user_id == current_user.id) def get_count_query(self): return super().get_count_query().filter(U_Daten.user_id == current_user.id) # 将视图添加到Flask-Admin实例 admin.add_view(UDatenModelView(U_Daten, db.session))
步骤2:在模板中添加操作按钮
修改ansicht.html模板,给表格增加“操作”列,添加指向Flask-Admin编辑、删除视图的按钮:
{% extends "base.html" %} {% block app_content %} <h1>Ansicht der Daten</h1> <table id="table_id" class="table table-striped"> <thead> <tr> <th>Datum</th> <!-- 其他字段表头 --> <th>Aktionen</th> </tr> </thead> <tbody> {% for item in data %} <tr> <td>{{ item.date }}</td> <!-- 其他字段内容 --> <td> <!-- 编辑按钮:跳转到Flask-Admin的编辑页面 --> <a href="{{ url_for('admin.u_daten.edit_view', id=item.id) }}" class="btn btn-sm btn-primary">Bearbeiten</a> <!-- 删除按钮:Flask-Admin删除需要POST请求,用表单包裹 --> <form action="{{ url_for('admin.u_daten.delete_view', id=item.id) }}" method="POST" style="display: inline;"> {{ csrf_token() }} <!-- 确保CSRF保护,需启用Flask-WTF --> <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?')">Löschen</button> </form> </td> </tr> {% endfor %} </tbody> </table> {% endblock %}
注意:
url_for里的admin.u_daten.edit_view中,u_daten是ModelView的默认endpoint(模型名小写加下划线),如果手动设置过endpoint参数,要替换成对应名称。
如果想让用户完成编辑/删除后自动跳回你的/daten页面,只需在UDatenModelView中添加redirect_back_list = True即可。
方案二:手动实现编辑/删除逻辑
如果你不想依赖Flask-Admin的路由,完全自定义流程,可以按以下步骤操作:
步骤1:创建编辑表单
用WTForms生成对应U_Daten模型的表单:
from flask_wtf import FlaskForm from wtforms import DateField, StringField, SubmitField from wtforms.validators import DataRequired class UDatenEditForm(FlaskForm): date = DateField('Datum', validators=[DataRequired()]) # 添加你的其他字段 submit = SubmitField('Speichern')
步骤2:添加编辑和删除路由
在Flask应用中新增两个路由,分别处理编辑和删除请求:
from flask import redirect, url_for, flash, render_template, abort from your_app.models import U_Daten from your_app.forms import UDatenEditForm @app.route("/daten/edit/<int:id>", methods=['GET', 'POST']) @login_required def edit_daten(id): # 获取条目并验证归属 item = U_Daten.query.get_or_404(id) if item.user_id != current_user.id: abort(403) # 禁止访问不属于自己的数据 form = UDatenEditForm(obj=item) if form.validate_on_submit(): form.populate_obj(item) db.session.commit() flash('Eintrag erfolgreich bearbeitet!') return redirect(url_for('ansicht')) return render_template('edit_daten.html', form=form, item=item) @app.route("/daten/delete/<int:id>", methods=['POST']) @login_required def delete_daten(id): item = U_Daten.query.get_or_404(id) if item.user_id != current_user.id: abort(403) db.session.delete(item) db.session.commit() flash('Eintrag erfolgreich gelöscht!') return redirect(url_for('ansicht'))
步骤3:创建编辑模板(可选)
需要一个edit_daten.html模板来渲染编辑表单:
{% extends "base.html" %} {% block app_content %} <h1>Eintrag bearbeiten</h1> <form method="POST"> {{ form.hidden_tag() }} <div class="form-group"> {{ form.date.label }} {{ form.date(class="form-control") }} </div> <!-- 其他字段 --> {{ form.submit(class="btn btn-primary") }} </form> {% endblock %}
步骤4:修改原页面的操作按钮
最后,在ansicht.html中更新按钮链接,指向自定义路由:
<td> <a href="{{ url_for('edit_daten', id=item.id) }}" class="btn btn-sm btn-primary">Bearbeiten</a> <form action="{{ url_for('delete_daten', id=item.id) }}" method="POST" style="display: inline;"> {{ form.hidden_tag() }} <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Sind Sie sicher?')">Löschen</button> </form> </td>
两种方案各有优劣:方案一省时间,利用Flask-Admin的成熟功能;方案二更灵活,完全自定义流程和样式,你可以按需选择。
内容的提问来源于stack exchange,提问作者Sven Tenscher
相关产品推荐
相关产品推荐

