2016-01-10 19 views
5

私はFlaskを使ってWebアプリケーションを開発しています。私はもともとは手動でHTMLフォームを作成していましたが、WTFormを使用するように切り替えました(これは教育プロジェクトなので、プロジェクトを構築する各ステップを示しています)。WTFormsでのHTML5フィールドの使用

EmailFieldなどのHTML5フォームフィールドを追加しようとすると、ちょっと混乱しました。 WTFormsのドキュメントとオンラインを検索したところ、HTML5 EmailFieldを使用してWTFormを作成する方法を見つけることができませんでした。

私はこのモジュールhttps://pypi.python.org/pypi/wtforms-html5をインストールしました。それは許可され、すべてが機能しました。しかし、特に積極的に開発されていないように見えます(https://github.com/brutus/wtforms-html5)、余分な依存関係を追加することに不満を抱いていました。

その後、WTFormsのgithubページが表示され、実際にはすべての新しいHTML5フィールドがサポートされていますが、これらのフィールドはデフォルトではインポートされません。 https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.pyしたがって代わりつ

from WTForms import TextField 

一つから推測なるよう

from WTForms import EmailField 

を使用する代わりに

を次のようにIは、以前wtforms-HTML5モジュールを用いた

from wtforms.fields.html5 import EmailField 

を使用しなければなりません

from wtforms_html5 import EmailField 

私はwtforms_html5のすべての出現をwtforms.fields.html5に変更しました。私のアプリケーションは期待どおりに動作しています。

すべての背景を読んでいただきありがとうございます。今の質問のために:

  • なぜ(EmailField、日付フィールドなど)がWTFormsのドキュメントに記載されたHTML5のフィールドのいずれかではありませんか?

  • は、なぜこれらのフィールドは、他の人

  • のように、デフォルトでWTFormsにインポートされているこれらのフィールドは安定している/使用するためのもの?

  • WTFormsからフィールドをインポートする場合のベストプラクティスはありますか?テキストフィールドの

、私は、次のいずれかを使用することができます。

from wtforms import TextField 
from wtforms.fields import TextField 
from wtforms.fields.simple import TextField 

しかしEmailFieldのために、私は

from wtforms.fields.html5 import EmailField 

を使用する必要があり、私は希望:

from wtforms.fields import TextField 
from wtforms.fields import EmailField 

しかし、これにはフィールドに行を追加する必要があります[__init__][1]ファイルですが、これは教育プロジェクトであり、これは学習者を混乱させるだけなので、私はしたくありません。

私は、HTML5のフィールド

  • wtforms-HTML5、サードパーティ製のモジュールを使用して継続する理由WTFormsが記述されていませんなぜか、デフォルトのインポートなどによって

    • インサイトを探しています。
  • 答えて

    5

    序文私はなぜに入る前に、私は著者の一人だと、現在WTForms

    の主要メンテナ私はWTFormsを使用している人々のための本当に一般的なパターンを作成することです言及する必要がありますあなたが望むすべてのビットを一つの名前空間にまとめるあなた自身のモジュール。あなたが好き以上を使用する場合があります

    from wtforms.fields import * 
    from wtforms import widgets, Form as _Form 
    from wtforms.fields.html5 import EmailField, 
    
    
    class Form(_Form): 
        """Awesome base form for myapp. Includes CSRF by default""" 
        class Meta: 
         csrf = True 
         csrf_secret = 'secretpasswordhere' 
    
         @property 
         def csrf_context(self): 
          return get_current_request().session 
    
        # maybe add some methods you really wanted to have on your Form class 
    

    あなたは注意しましょう from myapp.forms import *

    のようなスターのインポートと

    from myapp.forms import Form, TextField, EmailField, ... 
    
    class UserForm(Form): 
        name = TextField(...) 
        email = EmailField(...) 
    

    または交互にあなたのような何かをmyapp/forms.pyに例えば

    また、CSRFを設定し、デフォルトでCSRFコンテキストを提供するカスタムフォームサブクラスも含めましたが、これは厳密には必要ではありません。 (道Flask-WTFすることによって、あなたは、フラスコを使用している場合はあなたのために同様のCSRFの設定を行いますが、ポイントは、あなたが簡単に独自の統合を考え出すことができる方法を説明しました。)


    さて、なぜ。

    WTFormsのコアアイデアは、大部分のユースケースでうまく機能する非常にシンプルで安定したフレームワークを思い付くことでしたが、特定のユースケースで作業するためのコンパニオンツールを提供できるほど拡張性があります。

    初期の段階では、さまざまなライブラリと相互運用するためにextensionsを組み込むことができました。しかし、それはテストの複雑さと表面積を大幅に増やしただけでなく、奇妙な方法でWTFormsのリリースを引き起こすという点で問題を提起しました(Djangoはこれを変更したばかりで、新しいWTFormをリリースする必要があります)。 2015年には、すべての拡張機能を独自のパッケージに移行して、独自のリリーススケジュールを可能にすることにしました。すべてを行うためにしようとする単一のパッケージを使用する

    よりもむしろ力の人、これは少数を示すためにFlask-WTFWTForms-AlchemyWTForms-Djangoなどの固体コンパニオンパッケージと新興本当に素晴らしい生態系をもたらしました。

    なぜ、HTML5タイプが文書化されていないのか。まあ、それは省略です。また、いくつかのヒストリー:ある時点で、デフォルトのWTFormsフィールド出力をXHTML形式からHTMLコンパクト構文に切り替えました。コアフィールドの出力を維持しました。そのため、XHTML形式の貢献者、html5の貢献者、デフォルトのフィールドを希望する人たちがHTML5形式を使用していました。


    私はそれは長い答えを知っている、多分それを言うために短い方法は次のとおりです。WTFormsは、一般的にボックスアウトほとんどのWebフレームワークと連携んが、あなたの用途に設定してカスタマイズすることが設計されています。プラグアンドプレイではありません。

    +0

    本当に有益で詳細な返信をありがとう。ドキュメントはgithubにもありますか?簡単な記事を書いて、「フィールド」セクションにサブセクションを追加して、HTML5フィールドが利用可能であること、およびそれらにアクセスする方法について説明します。あなたと他のメンテナがリソースが足りない場合そう。私は現時点で多くの人が、おそらく私が取ったルートに従っていて、これらのフィールドを再追加するためにサードパーティのpipパッケージをインストール(または作成)していると思います。 – Sixhobbits

    1

    投稿者WTForms HTML5ここに。プロジェクトについて素早く頭を下げてください:は「維持されていませんでした」という意味では、それは私のために働いたので、何も追加する必要はありませんでした。バニラWTFormsは、すべてのものをサポートし始めて以来、私はただのWTFormsを使用することをお勧めします。

    WTForms HTML5バージョンでは、WTFormsでもサポートされているすべてのフィールドとウィジェットが削除され、その代わりにフォーム用のMetaクラスが使用されます。

    関連する問題