flask_admin更改inline_models行为

时间:2017-05-04 04:01:08

标签: python flask flask-admin

我想更改一些使用flask_admin的现有Python代码。其中一个视图使用inline_models(ClassName, Options)声明模式。内联类具有文本字段等。 我想通过以下方式更改flask_admin默认行为:

  • 我想将文本字段设为只读。即仍然显示它,但阻止用户更改现有内容。
  • 我不想让用户删除内联类的实例,即我想摆脱“删除?”每个条目旁边的复选框。
  • 我想用一些自定义JavaScript覆盖默认的“添加项”按钮行为。

我做了一些谷歌搜索,但任何看起来很有希望的东西看起来也非常重要。我希望有一些合理的直接方式来实现这一目标。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

Yeesh。看起来我们在这里记录在一个记录不佳的领域。我很难知道我是否已经改进了你已经找到的东西,但我希望你能找到比编写自定义管理视图模板更容易的东西。< / p>

  1. 在调用之后,看起来最终会将选项字典传递给InlineBaseFormAdmin的构造函数,其中提取和应用了各种form_* keys(不确定所有都被尊重,但我看到了至少form_base_class, form_columns, form_excluded_columns, form_args, form_extra_fields, form_rules, form_label, form_column_labels, form_widget_args)。我认为您可以通过form_widget_args完成所需的工作,但您也可以通过form_rules或覆盖InlineBaseFormAdmin的get_formpostprocess_form方法来实现目标:< / p>

    class SomeModelView(MyBaseModelView):
        ...
        inline_models = [(db.SomeOtherModel, {
            "form_widget_args": {
                "uneditable_field_name": {"readonly": True}
            }
        })]
        ...
    
  2. 可以通过提供自己的内联表单模型来覆盖display_row_controls来控制删除选项:

    from flask_admin.contrib.sqla.form import InlineModelConverter
    from flask_admin.contrib.sqla.fields import InlineModelFormList
    
    class CrouchingTigerHiddenModelFormList(InlineModelFormList):
        def display_row_controls(self, field): return False
    
    class MyInlineModelConverter(InlineModelConverter):
        inline_field_list_type = CustomInlineModelFormList
    
    #adding to above example
    class SomeModelView(MyBaseModelView):
        ...
        inline_model_form_converter = MyInlineModelConverter
        inline_models = [(db.SomeOtherModel, {
            "form_widget_args": {
                "uneditable_field_name": {"readonly": True}
            }
        })]
        ...
    

    注意:小部件args,例如readonly,正在以render_kw的形式传递给wtforms,但是一见不醒,WTForms文档并不清楚这些在结果HTML输入中表示为属性元素(所以任何HTML input element attributes在这里都有效)。

  3. 看起来form.js控制了这种行为,因此您应该能够修补其addInlineField方法,以便在添加模型之前或之后执行您自己的代码。您可以为此覆盖创建和/或编辑模板 - 但如果您使用flask-admin 1.5.0+,这可能就像将extra_js = ["your-custom.js"]添加到视图类一样简单(注意:它看起来这个脚本包含在此视图的每个页面上。)