【问题标题】:Django TextField and CharField is stripping spaces and blank linesDjango TextField 和 CharField 正在剥离空格和空行
【发布时间】: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 的行为突然与以前不同了,但是有没有一种简单的方法可以恢复自动生成的管理表单之前的默认设置?

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

【问题讨论】:

    标签: django django-admin textfield django-1.9


    【解决方案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()
      

      【讨论】:

      【解决方案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

        【讨论】:

          猜你喜欢
          • 2010-10-17
          • 2014-12-30
          • 2012-02-24
          • 1970-01-01
          • 2011-10-30
          • 1970-01-01
          • 2021-08-04
          相关资源
          最近更新 更多