2017-05-04 27 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"]一樣簡單(注意:它看起來像包含這個腳本在頁面爲此視圖)。