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

Posted

技术标签:

【中文标题】Django TextField 和 CharField 正在剥离空格和空行【英文标题】:Django TextField and CharField is stripping spaces and blank lines 【发布时间】:2016-12-24 01:26:44 【问题描述】:

我刚刚研究了我的“错误”,结果发现这是 Django 1.9 中的一个新功能,即默认情况下 CharFields 会去除空格: https://docs.djangoproject.com/en/1.9/ref/forms/fields/#django.forms.CharField.strip

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

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

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

【问题讨论】:

【参考方案1】:
strip=False 

在 CharFields 的模型字段中。


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

abc.strip()

【讨论】:

根据文档,strip 参数仅对表单字段有效,但对模型字段无效。我当然尝试过:TypeError: __init__() got an unexpected keyword argument 'strip' 就像我上面所说的,我想删除从 Django 1.9 开始的默认剥离功能 - 我基本上喜欢它,但对于我当前的项目,我希望不剥离空格【参考方案2】:

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

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

    class Meta:
        model = MyModel
        exclude = []

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

【讨论】:

【参考方案3】:

试试这个:

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

【讨论】:

这是个好主意..下次遇到这个问题时会检查一下:) 这对我来说效果很好!找不到它,所以我发布了 Is there a way to disable Django Admin removing trailing spaces in TextField strings? 并被标记为这个的骗子。【参考方案4】:

如果您正在寻找文本/字符字段并且不希望它去除空格,您可以在表单的构造方法中设置 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 在管理员中使用此表单。

【讨论】:

大约一年前,我自己已经用更简洁的语法回答了这个问题 :) 如果我想要模型表单中的模型字段而不是定义字段,我不确定您的解决方案将如何工作,只是为了确保它具有模型中定义的所有验证检查。你 1 岁的解决方案对我不起作用,所以我想出了这个解决方案并将其发布,所以它可能对某人有所帮助。 :) 实际上好点 - 重用生成的字段而不是重新定义它,如果该字段比我的旧用例更复杂,可能会在这里节省一些工作。【参考方案5】:

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

这是CharField上的其余文档

class SomeSerializer(serializers.ModelSerializer):
    content = serializers.CharField(trim_whitespace=False)

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

【讨论】:

【参考方案6】:

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

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

@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

【讨论】:

以上是关于Django TextField 和 CharField 正在剥离空格和空行的主要内容,如果未能解决你的问题,请参考以下文章

让 Django 为 TextField 而不是 textarea 构建 contenteditable div

Django之Model类

带有Q和多个类别的django查询

django模型三

Django:在保存之前更改 TextField

Django—综合案例