Django表单HTML5验证模式
Dugen Chen写了一篇很有帮助的文章,讲的是如何在Django表单字段中添加HTML5的'required'属性,以便进行验证。
我还希望能自动加入HTML5的pattern属性,这样如果我的表单是这样的:
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'属性会被正确地添加上去。
有没有人能解释一下如何为pattern属性做类似的事情?
能不能用装饰器来实现,这样这些代码就可以放在别的地方?
理想情况下,是否有一套标准的正则表达式模式可以匹配每个Django表单字段?有没有人建立一个小库,方便地将其添加到Django中?
谢谢!
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)
})
而混合类的方法基本上也是做同样的事情,不过它会遍历所有的属性,利用一些元编程的技巧,如果需要的话重新定义这些属性。关于这些基本概念,可以在这里了解。