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

时间:2016-08-17 11:46:56

标签: django textfield

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

要应用于文本字段的相同接缝。 所以我发现为什么Django突然表现出与以前不同的行为,但是有一种简单的方法来恢复自动生成的管理表单的先前默认值吗?

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

6 个答案:

答案 0 :(得分:8)

尝试使用:

# 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()

答案 1 :(得分:6)

strip=False 
在CharFields的模型字段中

Django TextField不支持此剥离功能,因此您必须自己完成。您可以使用条带方法。

abc.strip()

答案 2 :(得分:5)

如果您要查找文本/字符字段并且不希望其去掉空格,则可以在表单的构造方法中设置strip = False,然后在管理员中使用该表单

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在管理员中使用此表单。

答案 3 :(得分:3)

似乎最好的方法是创建一个这样的自定义管理表单:

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

    class Meta:
        model = MyModel
        exclude = []

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

答案 4 :(得分:1)

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

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

@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

答案 5 :(得分:0)

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

这是CharField

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

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