有条件地允许在列表视图中进行Flask管理员ModelView的编辑

时间:2018-08-20 22:04:44

标签: flask edit flask-admin

我可以在视图类中拥有这样的属性:

class MyExampleView(ModelView):

    @property
    def can_edit(self):
        # Return True or False based on some conditional logic

如何访问行的属性,以便例如可以有条件地在表中显示编辑列,也许如果行的is_active属性为True或False。

1 个答案:

答案 0 :(得分:0)

您可以通过增强一些模板操作来实现这一点,在其中添加了一种检查行可用性的方法:

RegisterResult()

然后,您需要在from flask_admin.model import template class AccessMixin: def has_access(self, row): raise NotImplementedError() class ViewRowAction(template.ViewRowAction, AccessMixin): def has_access(self, row): return True class EditRowAction(template.EditRowAction, AccessMixin): def has_access(self, row): return row.is_active class DeleteRowAction(template.DeleteRowAction, AccessMixin): def has_access(self, row): return row.is_active 模板中覆盖list_row_actions块以使用此新方法:

list.html

然后您需要模型类来使用覆盖的行操作和列表模板:

{% extends 'admin/model/list.html' %}

{% block list_row_actions scoped %}
  {% for action in list_row_actions %}
    {% if action.has_access(row) %}
      {{ action.render_ctx(get_pk_value(row), row) }}
    {% endif %}
  {% endfor %}
{% endblock %}

请注意,原始的from flask_admin.contrib.sqla.view import ModelView class MyExampleView(ModelView): list_template = 'app_list.html' def get_list_row_actions(self): return ( ViewRowAction(), EditRowAction(), DeleteRowAction(), ) 方法使用get_list_row_actionscan_view_detailscan_editcan_deletedetails_modal属性来定义已使用动作的列表。您可以通过重写此逻辑来丢弃它。

这也不会阻止用户实际编辑或删除对象(例如,通过在浏览器中手动键入编辑视图URL)。您需要在视图方法中实现访问权限检查,例如:

edit_modal