Django TextField 和 CharField 正在剥离空格和空行

Django TextField and CharField is stripping spaces and blank lines

我刚刚研究了我的 "bug",事实证明这是 Django 1.9 中的一个新功能,即 CharFields 默认去除空格: https://docs.djangoproject.com/en/1.9/ref/forms/fields/#django.forms.CharField.strip

应用于文本字段 TextField 的相同接缝。

所以我发现了为什么 Django 的行为突然与以前不同了,但是有没有一种简单的方法可以恢复以前自动生成的管理表单的默认值?

我不想删除空格,同时仍然使用管理员自动生成的表单。还有可能吗?

strip=False 

在 CharFields 的模型字段中。


Django TextField 不支持这种剥离功能,所以你必须自己做。您可以使用剥离方法。

abc.strip()

似乎处理此问题的最佳方法是创建一个自定义管理表单,如下所示:

class CustomForm(forms.ModelForm):
    my_field = forms.CharField(strip=False, widget=forms.Textarea)

    class Meta:
        model = MyModel
        exclude = []

这将创建一个默认表单,仅 my_field 被未删除的版本覆盖。 )这当然必须在相应的管理员中设置。如果有人知道更简单的版本。请告诉我!

试试这个:

# fields.py
from django.db.models import TextField


class NonStrippingTextField(TextField):
    """A TextField that does not strip whitespace at the beginning/end of
    it's value.  Might be important for markup/code."""

    def formfield(self, **kwargs):
        kwargs['strip'] = False
        return super(NonStrippingTextField, self).formfield(**kwargs)

在您的模型中:

class MyModel(models.Model):
    # ...
    my_field = NonStrippingTextField()

如果您正在寻找一个 text/char 字段并且不希望它去除空格,您可以在表单的构造方法中设置 strip=False,然后在 admin[=12] 中使用该表单=]

class YourForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(YourForm, self).__init__(*args, **kwargs)
        self.fields['myfield'].strip = False

    class Meta:
        model = YourModel
        fields = "__all__"

然后您可以通过在 admin.py 文件中指定 form=YourForm 在管理员中使用此表单。

我在使用 django-rest 模型序列化程序时遇到了这个问题。我的文本字段中的数据被去掉了白色 space。因此,如果您尝试在序列化程序级别执行此操作,则可以在 CharField 序列化程序上指定 whitespace 参数。这是源代码 signature.

这是 CharField

上的其余文档
class SomeSerializer(serializers.ModelSerializer):
    content = serializers.CharField(trim_whitespace=False)

    class Meta:
        model = YourModel
        fields = ["content"]

您也可以通过修改 ModelAdmin 来实现。

覆盖 formfield_for_dbfield 函数并为 title 字段设置 kwargs['strip'] = False 将禁用它的自动 trim。

@admin.register(Example)
class ExampleAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, request, **kwargs):
        if db_field.name == 'title':
            kwargs['strip'] = False
        return super().formfield_for_dbfield(db_field, request, **kwargs)

参考:https://www.aaronoellis.com/articles/allow-whitespace-to-be-a-valid-charfield-value-in-django-admin