我刚刚发现Django不会自动从表单字段输入中去掉多余的空格,我想我理解其中的道理(“框架不应该改变用户输入”)。
我想我知道如何使用python的re删除多余的空格:
#data = re.sub('\A\s+|\s+\Z', '', data)
data = data.strip()
data = re.sub('\s+', ' ', data)问题是我应该在哪里做这件事?大概这应该发生在表单的某个干净阶段,但是是哪个阶段呢?理想情况下,我希望清除所有字段中的多余空格。如果它应该在clean_field()方法中完成,那就意味着我将不得不有许多clean_field()方法基本上做同样的事情,这看起来像是大量的重复。
如果不是表单的清理阶段,那么可能是在表单所基于的模型中?
发布于 2014-01-22 01:57:20
我的方法借鉴自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]要使用,只需将混合添加到您的表单中
class MyForm(StripeWhitespaceMixin, ModelForm):
...此外,如果您想在保存没有表单的模型时修剪空白,您可以使用以下混合。没有表单的模型在默认情况下是不会被验证的。当我基于从外部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):
....发布于 2012-05-04 00:57:09
创建自定义模型域,以便自动使用自定义表单域。
class TrimmedCharFormField(forms.CharField):
def clean(self, value):
if value:
value = value.strip()
return super(TrimmedCharFormField, self).clean(value)
# (If you use South) add_introspection_rules([], ["^common\.fields\.TrimmedCharField"])
class TrimmedCharField(models.CharField):
__metaclass__ = models.SubfieldBase
def formfield(self, **kwargs):
return super(TrimmedCharField, self).formfield(form_class=TrimmedCharFormField, **kwargs)然后在您的模型中,只需用TrimmedCharField替换django.db.models.CharField
发布于 2011-11-30 11:24:58
将其添加到表单中的def clean(self):中如何?
您的方法可能如下所示:
def clean(self):
cleaned_data = self.cleaned_data
for k in self.cleaned_data:
data = re.sub('\A\s+', '', self.cleaned_data[k])
data = re.sub('\s+\Z', '', data)
data = re.sub('\s+', ' ', data)
cleaned_data[k]=data
return cleaned_datahttps://stackoverflow.com/questions/8320739
复制相似问题