【问题标题】:How to prevent Django ModelAdmin from stripping whitespaces?如何防止 Django ModelAdmin 去除空格?
【发布时间】:2018-12-11 18:38:29
【问题描述】:

所以我在 Django ModelAdmin 中定义了 readonly_fields,其可调用如下所示:

class TestAdmin(admin.ModelAdmin):
    readonly_fields = ("test_field_with_whitespace",)

    def test_field_with_whitespace(self, obj):
        return '     Hello      World'

在相应的管理视图中,只读字段显示为“Hello World” - 因此没有空格。

我可以做些什么来显示空格?

【问题讨论】:

    标签: django python-3.x django-modeladmin


    【解决方案1】:

    这与模型管理员无关。 HTML 本身会去除所有空格。如果您需要精确显示,则需要将其包装在 <pre> 标记中 - 由于您现在正在发送 HTML,您需要将其标记为安全以避免自动转义。

    from django.utils.safestring import mark_safe
    ...
    return mark_safe('<pre>     Hello      World</pre>')
    

    【讨论】:

    • 感谢您的回答。我很困惑,因为普通的模型。文本字段将在管理视图中显示为所有空格 - 只读字段不是。
       并不是我想要的,因为它带有特定的样式。但我可以弄清楚从这里去哪里 - 例如用   替换所有空格等等
    • 如果您正在呈现用户输入,请使用 mark_safe,因为您将面临 js 注入攻击。
    【解决方案2】:

    接受的答案容易受到 js 注入攻击。

    为了不易受到 js 注入攻击,最好将自定义 css 添加到管理模型中。实现这一目标的一种方法是:

    @admin.register(MyModel)
    class SomeAdmin(admin.ModelAdmin):
    
        class Media:
            css = {
                'all': ('css/admin.css',),
            }
    

    admin.css 文件:

    div.readonly {
        white-space: pre;
    }
    

    【讨论】: