2017-05-04 14 views
2

flask_adminを使用する既存のPythonコードを変更したいと思います。ビューの1つはと(ClassName, Options)宣言パターンを使用します。インラインクラスには、とりわけ、テキストフィールドがあります。 フラスコのデフォルト動作を次のように変更したいとします。flask_adminはinline_modelsの動作を変更します

  • テキストフィールドを読み取り専用にしたいとします。私。それでも表示はしますが、ユーザーが既存のコンテンツを変更できないようにします。
  • ユーザーがインラインクラスのインスタンスを削除できないようにしたい、つまり「削除」を取り除きたいすべてのエントリの横にあるチェックボックスをオンにします。
  • カスタムJavaScriptでデフォルトの[項目の追加]ボタンの動作をオーバーライドしたいと思います。

私はいくつかの検索を行いましたが、潜在的に有望であると思われるものも非常に重要ではありませんでした。私はこれを達成するための合理的に単純な方法を望んでいます。

あなたの助けに感謝します。

答えて

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_formまたはpostprocess_form方法オーバーライドすることによって、あなたはおそらくもそこに着くことができます:削除オプションは、独自のインラインフォームのモデルを提供することにより、制御することができる

    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} 
         } 
        })] 
        ... 
    

    注:このよう読み取り専用としてウィジェット引数は、render_kwとしてwtformsに渡さなっているが、赤面でWTFormsのドキュメントは、これらのEXPRESを得ることは明らかではありません結果として得られるHTML入力要素の属性としてsedを使用します(ここではHTML input element attributesが有効です)。

  3. form.jsはこの動作を制御しているため、addInlineFieldメソッドをモンキーパッチして、モデル追加の前後に独自のコードを実行できるはずです。フリンジ管理者1.5.0+を使用している場合、これはビュークラスにextra_js = ["your-custom.js"]を追加するだけで簡単です(注意:このスクリプトが含まれているように見えますにあります。このビューではすべてページです)。

関連する問題