1

Dugen Chen 写了一篇很有帮助的文章,将 HTML5 验证中的“必需”属性添加到 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-" />

杜根使用了这种方法:

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()  

并且将适当添加“必需”属性

有人可以解释如何为模式属性做类似的事情。所有这些都可以用装饰器应用,这样这个烂摊子就可以放在其他地方吗?

理想情况下,是否有一组标准化的正则表达式模式来匹配每个 Django 表单字段,是否有人构建了一个小型库以轻松将其添加到 Django 中?

谢谢!

4

1 回答 1

1

这里有两个选择。您可以创建一个更新类中所有字段的 mixin,或者对标准库进行猴子补丁。

对于monkeypatch,您可以执行以下操作:

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

mixin 方法基本上会做同样的事情,但是通过迭代属性涉及一些元编程魔法,并在必要时重新定义它们。此处概述了一般概念。

于 2013-03-02T23:17:50.890 回答