【问题标题】:Normalize CRLF line endings in Django form input规范化 Django 表单输入中的 CRLF 行尾
【发布时间】:2021-10-08 04:30:16
【问题描述】:

我有一个带有 TextArea 的 ModelForm。如果用户提交带有换行符的文本,浏览器会将其转换为 \r\n。我希望 Django 为我规范化这个文本,但它没有。

这是一个问题,因为 Django 的 maxlength 验证与 HTML 中的 maxlength 不一致,因为浏览器内的行结尾仅被视为“\n”。

因此,如果 textarea 的最大长度为 5,并且用户输入 "ab\ncd",他们认为这很好,但是当他们提交表单时,Django 会出错,因为它看到 "ab\r\ncd",即 6 个字符。我想通过使用\n 来解决这个问题,而不是将\r\n 保存到数据库中。

【问题讨论】:

    标签: python django


    【解决方案1】:

    这可以通过覆盖表单字段上的 to_python 方法来完成。这作为将表单数据序列化为 python 的一部分运行,因此它发生在任何字段验证或清理之前(否则可能由于不正确的行长度而出错)。请注意,这与覆盖小部件(控制表单在 HTML 中的显示方式)或模型字段(控制数据在数据库中的存储方式)不同。

    from django.utils.text import normalize_newlines
    
    class MyCharField(forms.CharField):
        def to_python(self, value):
            # NOTE: No security guarantees are made about this code
            return super().to_python(normalize_newlines(value))
    

    然后像这样覆盖表单中使用的字段:

    class MyForm(forms.ModelForm):
        class Meta:
            widgets = {
                "text": forms.Textarea() # Unchanged
            }
    
            field_classes = {
                "text": MyCharField,
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2016-06-20
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多