web-dev-qa-db-ja.com

Django TextFieldとCharFieldは、スペースと空白行を削除しています

私は自分の「バグ」を調べたところ、Django 1.9で、CharFieldsがデフォルトでスペースを削除するという新機能であることが判明しました: https://docs.djangoproject.com/en /1.9/ref/forms/fields/#Django.forms.CharField.strip

テキストフィールドTextFieldに適用するのと同じ継ぎ目。

だから私はDjangoが突然以前とは異なる動作をする理由を見つけましたが、自動生成された管理フォームの以前のデフォルトを復元する簡単な方法はありますか?

管理者から自動生成されたフォームを使用している間は、スペースを削除したくありません。それはまだ可能ですか?

14
Andy

Text/charフィールドを探していて、空白を削除したくない場合は、フォームのコンストラクターメソッドで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を指定することにより、管理者でこのフォームを使用できます。

10

これを使用してみてください:

# 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()
10
Udi
strip=False 

charFieldsのモデルフィールド。


Django TextFieldはこのストリッピング機能をサポートしていないため、自分で行う必要があります。ストリップ法を使用できます。

abc.strip()
7
Aamish Baloch

これを処理する最良の方法は、次のようなカスタム管理フォームを作成することです。

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

    class Meta:
        model = MyModel
        exclude = []

これにより、my_fieldだけが削除されていないバージョンで上書きされたデフォルトのフォームが作成されます。 )もちろん、これは対応する管理者で設定する必要があります。誰かがさらに単純なバージョンを知っているなら。教えてください!

3
Andy

Django-restモデルシリアライザーでこの問題が発生していました。テキストフィールドのデータから空白が削除されました。したがって、シリアライザーレベルでこれを実行しようとしている場合は、CharFieldシリアライザーで空白パラメーターを指定できます。これがソースコードです signature

そしてここに残りがあります CharField のドキュメント

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

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