2013-03-02 63 views
1

Dugen Chen写了一篇有用的文章,将HTML5验证中的'required'属性添加到Django表单字段中。 http://duganchen.ca/elegantly-adding-html5-validation-attributes-to-django-form-fields/Django格式化HTML5验证模式

我也想有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() 

,并会加入“需要”属性适当

有人能解释如何做到与pattern属性类似的东西。 所有这些都可以应用于一个装饰器,以便这个混乱可以驻留在别的地方?

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

谢谢!

回答

1

想到两个选项,这里。你可以创建一个混合类来更新该类的所有字段,或者修改标准库。

为了猴补丁,你会做这样的事情:

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

的混入办法将基本上做同样的事情,但通过循环属性有一些元编程魔术并在必要时重新定义它们。一般概念是outline here