12

私は Flask-Admin と PeeWee Backend ModelView を組み合わせて研究しています (ただし、私の質問は SQLAlchemy バックエンドにも適用される可能性があります)。ドキュメントや例で見つけられなかったことが 2 つあります。

(1)。モデルに一意のフィールドがあり、それをテスト/複製しようとすると、デフォルトの Flask クラッシュ画面が表示され、「IntegrityError: 列のユーザー名が一意ではありません」というメッセージが表示されます。

https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.pyで利用可能な PeeWee の例をテストしており、21 行目を "username = peewee.CharField(max_length= 80、一意 = True)"

次に、「username」=「user1」で 2 人のユーザーを追加しようとします。

編集画面 (またはリスト画面でさえ、どの管理画面でも可能) に戻り、制御されたエラー メッセージを表示する丁寧な方法はありますか? カスタム エラー メッセージは必要ありません。現在のメッセージは問題ありません (IntegrityError: 列のユーザー名が一意ではありません)。しかし、私はクラッシュ画面を望んでいません。

Flask のデフォルトの 500 ページをセットアップ/使用することはできましたが、Flask-Admin フローを完全に終了し、ユーザーは入力したばかりのデータを「見逃す」ことになります。

編集画面に戻りたいのですが、何らかのアラート/エラー メッセージが表示されます。テンプレートを拡張する必要はありません。これは問題ではありません。しかし、エラーをインターセプトして適切に処理する場所が見つかりませんでした。助言がありますか?

(2):

また、フローに保存前の検証を追加する方法も必要です。たとえば、initial_date と final_date を持つエンティティの編集フォームにいて、保存する前に final_date が initial_date より大きいか null であることを確認したいと考えています。

このクライアント側で、javascript を使用して、そのエンティティの編集テンプレートを拡張し、検証スクリプトをテール ブロックに追加する (そして form.submit イベントをインターセプトする) ことができます。

しかし、検証でサーバー側の土壇場での検証が必要な場合はどうすればよいでしょうか? 質問1で説明したのと同じ方法で、フローを傍受して検証を追加し、運が良ければエラーメッセージを返す方法/場所はありますか?

前もって感謝します、

よろしく、

4

1 に答える 1

23

役立つものをいくつか見つけたと思いますが、私の質問には完全には答えていません。

PasteBin に例を投稿しました: http://pastebin.com/siwiaJAw

まず、「保存前」のステップが見つかりませんでしたが、フィールド レベルのカスタム検証を追加する方法を見つけました。これは、作成と更新の場合に役立ちます。

例を確認すると、37 ~ 39 行目と 42 ~ 44 行目に次のように追加されていることがわかります。

def no_root_allowed(form, field):
    if field.data == 'root':
        raise ValidationError('"root" is not allowed')

form_args = dict(
    username=dict(validators=[no_root_allowed])
)

このバリデーターは「フォーム」と「フィールド」を受け取るので、複数のフィールド (開始日 < 終了日など) を含む検証を行うことができます。たとえば、モデル クラスにアクセスして ID の重複をチェックすることもできます。

したがって、これで作成/編集の検証が解決されます。バリデーターが失敗すると、Flask-Admin によって、既に入力されている編集フォームに戻ります。良い!

しかし、削除には問題があります。特定のオブジェクトを削除したくない場合は、can_delete = False としてフラグを立てることができますが、それではどのインスタンスも削除されなくなります。

私が見つけた最善の方法は、delete_model メソッド (55 行目) をインターセプトし、削除前の検証が失敗した場合に False を返すことでした。しかし、それではメッセージが表示されず、フォームに戻るだけです。その特定のインスタンスを削除できなかったというメッセージをユーザーに送信する方法が見つかりませんでした。

勉強を続けて、新しいニュースを投稿します。

ありがとう!

于 2014-04-14T19:44:49.773 に答える