You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:55