我的方法借鉴自这里。但我使用了一个mixin而不是子类化django.forms.Form。这样我就可以同时与Form
和ModelForm
一起使用它。这里定义的方法覆盖了BaseForm
的_clean_fields
方法。
class StripWhitespaceMixin(object):
def _clean_fields(self):
for name, field in self.fields.items():
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial)
value = field.clean(value, initial)
else:
if isinstance(value, basestring):
value = field.clean(value.strip())
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError as e:
self._errors[name] = self.error_class(e.messages)
if name in self.cleaned_data:
del self.cleaned_data[name]
使用时,只需将mixin添加到您的表单中即可
class MyForm(StripeWhitespaceMixin, ModelForm):
...
还有,如果您想在保存没有表单的模型时修剪空白,可以使用以下mixin。默认情况下不验证没有表单的模型。当我基于从外部REST API调用返回的JSON数据创建对象时,我会使用它。
class ValidateModelMixin(object):
def clean(self):
for field in self._meta.fields:
value = getattr(self, field.name)
if value:
try:
setattr(self, field.name, value.strip())
except Exception:
pass
def save(self, *args, **kwargs):
self.full_clean()
super(ValidateModelMixin, self).save(*args, **kwargs)
然后在您的models.py文件中
class MyModel(ValidateModelMixin, Model):
....
strip
函数,而不是折腾正则表达式。 - Michael C. O'Connordata = data.strip()
替换掉那个第一行(丑陋的)代码。 - juliomalegriadata = ' '.join(data.split())
。 - mlissner