Django表单HTML5验证模式

1 投票
1 回答
3135 浏览
提问于 2025-04-17 17:43

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

而混合类的方法基本上也是做同样的事情,不过它会遍历所有的属性,利用一些元编程的技巧,如果需要的话重新定义这些属性。关于这些基本概念,可以在这里了解

撰写回答