我的方法是借鉴here。但我没有继承 django.forms.Form,而是使用了 mixin。这样我就可以将它与Form 和ModelForm 一起使用。这里定义的方法覆盖了BaseForm的_clean_fields方法。
class StripWhitespaceMixin(object):
def _clean_fields(self):
for name, field in self.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
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:
# ducktyping attempt to strip whitespace
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):
....