2017-05-04 77 views
2

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

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

我做了一些Google搜索,但任何看起来潜在有希望的东西也看起来非常平凡。我希望有一些相当直接的方法来实现这一点。

您的帮助将不胜感激。

回答

1

Yeesh。看起来我们在这里记录不完整的领域。很难知道我是否正在改进已经找到的内容,但我希望您在寻找比编写自定义管理视图模板更简单的方法。

  1. 继电话,它看起来像选项字典最后给其中各种form_* keys提取和应用的InlineBaseFormAdmin构造函数(不知道所有人都尊重,但我看到至少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 get方法有:

    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,如只读,越来越传给wtforms为render_kw,但在腮红WTForms文档都不清楚的是,这些获得EXPRES sed作为生成的HTML输入元素中的属性(因此,此处任何HTML input element attributes均有效)。

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