1

Dugen Chenは、HTML5の検証で「required」属性をDjangoフォームフィールドに追加することについて役立つ投稿を書きました。 http://duganchen.ca/elegantly-adding-html5-validation-attributes-to-django-form-fields/

また、HTML5パターン属性を自動的に含めて、これが私のフォームである場合は次のようにします。

class AccountEditForm(forms.Form):
  email = forms.EmailField()
  phone = forms.CharField(widget=forms.IntegerField)

次に、次のhtmlが作成されます。

<input type="email" name="email" id="id_email" required pattern="-email regex-" />
<input type="text" name="phone" id="id_phone" required pattern="-integer regex-" />

Dugenはこの方法を使用しました:

compose = lambda f, g: lambda *args, \
          **kwargs: f(g(*args, **kwargs))

def html5_required(field):
  if field.required != False:
    field.widget.attrs['required'] = 'required'
  return field

CharField = compose(html5_required, CharField)

フォームを次のように書くことができるように

class SampleForm(form):
  text_field = CharField()  

'required'属性が適切に追加されます

誰かがパターン属性に対して同様のことを行う方法を説明できますか?このすべてをデコレータで適用して、この混乱を別の場所に置くことができますか?

理想的には、各Djangoフォームフィールドに一致するように標準化された正規表現パターンのセットがあり、誰かがそれをDjangoに簡単に追加するための小さなライブラリを構築しましたか?

ありがとう!

4

1 に答える 1

1

ここで、2 つのオプションが思い浮かびます。クラスのすべてのフィールドを更新する mixin を作成するか、標準ライブラリにモンキーパッチを適用できます。

モンキーパッチするには、次のようにします。

from django.forms import fields
fields.__dict__.update({
    name: compose(html5_required, field)
    for name, field in fields.__dict__.iteritems()
    if issubclass(field.__class__, fields.Field)
})

ミックスイン アプローチは基本的に同じことを行いますが、属性を反復処理することで、メタ プログラミング マジックが必要になり、必要に応じて属性を再定義します。一般的な概念については、こちらで概説しています

于 2013-03-02T23:17:50.890 に答える