首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从哪里清除表单字段输入中多余的空格?

问从哪里清除表单字段输入中多余的空格?
EN

Stack Overflow用户
提问于 2011-11-30 11:22:37
回答 8查看 6.5K关注 0票数 8

我刚刚发现Django不会自动从表单字段输入中去掉多余的空格,我想我理解其中的道理(“框架不应该改变用户输入”)。

我想我知道如何使用python的re删除多余的空格:

代码语言:javascript
复制
#data = re.sub('\A\s+|\s+\Z', '', data)
data = data.strip()
data = re.sub('\s+', ' ', data)

问题是我应该在哪里做这件事?大概这应该发生在表单的某个干净阶段,但是是哪个阶段呢?理想情况下,我希望清除所有字段中的多余空格。如果它应该在clean_field()方法中完成,那就意味着我将不得不有许多clean_field()方法基本上做同样的事情,这看起来像是大量的重复。

如果不是表单的清理阶段,那么可能是在表单所基于的模型中?

EN

回答 8

Stack Overflow用户

发布于 2014-01-22 01:57:20

我的方法借鉴自here。但我使用的不是django.forms.Form的子类化,而是mixin。这样我就可以在Form和ModelForm上使用它了。这里定义的方法覆盖了BaseForm的_clean_fields方法。

代码语言:javascript
复制
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]

要使用,只需将混合添加到您的表单中

代码语言:javascript
复制
class MyForm(StripeWhitespaceMixin, ModelForm):
    ...

此外,如果您想在保存没有表单的模型时修剪空白,您可以使用以下混合。没有表单的模型在默认情况下是不会被验证的。当我基于从外部rest api调用返回的json数据创建对象时,我使用它。

代码语言:javascript
复制
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中

代码语言:javascript
复制
class MyModel(ValidateModelMixin, Model):
    ....
票数 10
EN

Stack Overflow用户

发布于 2012-05-04 00:57:09

创建自定义模型域,以便自动使用自定义表单域。

代码语言:javascript
复制
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

票数 9
EN

Stack Overflow用户

发布于 2011-11-30 11:24:58

将其添加到表单中的def clean(self):中如何?

有关更多文档,请参阅:https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

您的方法可能如下所示:

代码语言:javascript
复制
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_data
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8320739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档