【问题标题】:Custom list view with Flask-Admin使用 Flask-Admin 自定义列表视图
【发布时间】:2025-12-16 03:20:08
【问题描述】:

我有一个简单的模型调用,我正在使用 Flask-Admin 来创建/编辑/删除此模型的实例。

呼叫字段之一是音频文件的路径。我希望能够通过添加一些 html 代码在管理员中播放文件。我检查了模板flask_admin/templates/bootstrap3/admin/model/list.html,似乎做我想做的唯一方法是在行尾添加一个单元格,这意味着扩展list.html,复制整个块list_row并添加我的单元格。

这是唯一的方法吗?或者有什么办法可以用我的音频播放器(基本上是一个 html5 )在表单中添加一个“假”字段?

flask_admin/templates/bootstrap3/admin/model/list.html

....

{% for c, name in list_columns %}
    <td class="col-{{c}}">
    {% if admin_view.is_editable(c) %}
        {% if form.csrf_token %}
            {{ form[c](pk=get_pk_value(row), value=get_value(row, c), csrf=form.csrf_token._value()) }}
        {% else %}
            {{ form[c](pk=get_pk_value(row), value=get_value(row, c)) }}
        {% endif %}
    {% else %}
        {{ get_value(row, c) }}
    {% endif %}
    </td>
{% endfor %}
<td>ADD MY CUSTOM CELL HERE?</td>
....

models.py

class Call(db.Model):
    __tablename__ = 'calls'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    path = db.Column(db.Unicode(128))

    def __unicode__(self):
        return self.name

【问题讨论】:

    标签: flask flask-admin


    【解决方案1】:

    有一个更简单的方法是使用column_formatters

    from flask import Markup
    
    class CallView(sqla.ModelView):
        def _mp3_formatter(view, context, model, name):
            return Markup('<a href="{}">{}</a>'.format(url_for('path_to_mp3_view', filename=model.path), model.name)
        column_formatters = {
           'path': _mp3_formatter
        }
    

    或者您甚至可以传递一个 Jinja2 宏(必须存在于覆盖模板中):

    class CallView(sqla.ModelView):
        column_formatters = dict(path=macro('render_path_mp3'))
    

    在模板中:

    {% macro render_path_mp3(model, column) %}
       <a href="{{ url_for('path_to_mp3_view', filename=model.path) }}">{{ model.name }}</a>
    {% endmacro %}
    

    创建自定义视图函数path_to_mp3_view 已作为练习省略.. ;)

    【讨论】:

    • 太好了,谢谢。不过我会使用audio html 5 标签。
    【解决方案2】:

    这是一个旧线程,但为了将来参考,现在有column_extra_row_actionsBaseListRowAction。更多信息在这里: http://flask-admin.readthedocs.io/en/latest/api/mod_model/

    【讨论】: