6

問題を要約するのに苦労しているので、タイトルは実際にはそれを言いません。だからここに長い説明があります:

複数の連絡先の情報を追加していて、次のフィールドがあるとしましょう。

  • 連絡先の名前
  • 連絡方法 (電子メール、電話番号、インスタント メッセージ)
    • メールの場合: メール フィールドを表示します (このフィールドが存在するとします)
    • 電話番号の場合: 電話番号欄を表示する
    • インスタント メッセージの場合: テキスト フィールドを表示する

すぐに、ページ自体でこれを完了するには (連絡先フィールドを追加または削除するために) JavaScript が必要になりますが、これで問題ありません。ただし、複数の連絡先を追加できるため (ソフトウェア開発者として、ユーザーが追加したい連絡先の数はわかりません。1、10、または 100 の可能性があります)。

だから私の最大の問題は、各フィールドの名前などをどのように構造化するかということです。のようなものにすべてを投入しnames[]contactmethods[]順番にアクセスする必要がありますか、それともより良い解決策があるかどうか。

さらに、サーバーがこれらの情報の検証を開始し、不正な形式の情報を見つけた場合、クライアントがサーバーに送信したデータをクライアントに送り返すことができるようにしたいと考えています。入りました。どうすればそれを簡単に達成できますか?

背景情報: 現在使用されている技術 (関連するもの):

  • フラスコ
  • jQuery
  • WTフォーム
4

1 に答える 1

6

何も構築する必要はありません (少なくともサーバー側では) - WTForms は既に必要なものをサポートしています - それらは「フィールド エンクロージャ」と呼ばれます。探している動作は と にwtforms.fields.FormFieldありますwtforms.fields.FieldList

class ContactForm(Form):
    name = TextField("Name", validators=[Required()])
    contact_type = SelectField("Contact Type",
                                validators=[Required()],
                                choices=[
                                    ("email", "Email"),
                                    ("phone", "Phone Number"),
                                    ("im", "Instant Message")
                                ])
    # `If` is a custom validator - see below
    email_address = TextField("Email",
                                  validators=[If("contact_type",
                                                     "email",
                                                     [Required(), Email()])
                                  ])
    phone_number = TextField("Phone #",
                                  validators=[If("contact_type",
                                                           "phone", [Required()])
                                  ])
    im_handle = TextField("IM Handle",
                                  validators=[If("contact_type",
                                                           "im", [Required()])
                                  ])


class SignUpForm(Form):
    # Other fields go here
    contacts = FieldList(FormField(ContactForm))

ユーザーの選択に応じて、適切なフィールドを検証するためのカスタム バリデーターも必要になります。

# CAUTION: Untested code ahead
class If(object):
    def __init__(self,
                      parent,
                      run_validation=None,
                      extra_validators=None,
                      msg=None):
        self.parent = parent
        self.msg = msg if msg is not None else u"Invalid"
        if callable(run_validation):
            self.run_validation = run_validation
        else:
            _run_validation = lambda self, parent, form: parent.data == run_validation
            self.run_validation = _run_validation
        self.extra_validators = extra_validators if extra_validators is not None \
                                                     else []

    def __call__(self, field, form):
        parent = getattr(form, self.parent)
        if self.run_validation(parent, form):
            return field.validate(form, extra_validators=self.extra_validators)

サーバー側で呼び出すform.validate()と、フィールドは要件に対して自動的にチェックされ、エラーが適切に入力されるため、クライアント側でそれらをレンダリングできます。

クライアント側で新しいフィールドを作成するのは簡単で、WTForms が使用するのと同じ命名規則を使用して名前を付ける限り、WTForms はバックエンドでそれらを取得しますfield.short_name + '-' + index

于 2012-07-10T03:26:57.607 に答える